exlpose

# ------------------------------------------------------------------------------
# Copyright (c) Microsoft
# Licensed under the MIT License.
# Written by Bowen Cheng (bcheng9@illinois.edu) and Bin Xiao (leoxiaobin@gmail.com)
# ------------------------------------------------------------------------------

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from collections import defaultdict
from collections import OrderedDict
import logging
import os
import os.path

import cv2
import json_tricks as json
import numpy as np
from torch.utils.data import Dataset

from crowdposetools.cocoeval import COCOeval
# from dataset.JointsDataset import JointsDataset

from dataset.JointsDataset import JointsDataset
from nms.nms import oks_nms
from nms.nms import soft_oks_nms

# -------------------------------------------
crowdpose_sigmas = np.array([.79, .79, .72, .72, .62, .62, 1.07, 1.07, .87, .87, .89, .89, .25, .25]) / 10.0

# -------------------------------------------

logger = logging.getLogger(__name__)


class EXLPOSEDataset(JointsDataset):
    """`CrowdPose`_ Dataset.

    Args:
        root (string): Root directory where dataset is located to.
        dataset (string): Dataset name(train2017, val2017, test2017).
        data_format(string): Data format for reading('jpg', 'zip')
        transform (callable, optional): A function/transform that  takes in an opencv image
            and returns a transformed version. E.g, ``transforms.ToTensor``
        target_transform (callable, optional): A function/transform that takes in the
            target and transforms it.
    """

    def __init__(self, cfg, root, image_set, is_train, transform=None):
        super().__init__(cfg, root, image_set, is_train, transform=None)

        # def __init__(self, root, dataset, data_format, transform=None,
        #              target_transform=None):
        from crowdposetools.coco import COCO
        self.nms_thre = cfg.TEST.NMS_THRE
        self.image_thre = cfg.TEST.IMAGE_THRE
        self.soft_nms = cfg.TEST.SOFT_NMS
        self.oks_thre = cfg.TEST.OKS_THRE
        self.in_vis_thre = cfg.TEST.IN_VIS_THRE
        self.bbox_file = cfg.TEST.COCO_BBOX_FILE
        self.use_gt_bbox = cfg.TEST.USE_GT_BBOX
        self.image_width = cfg.MODEL.IMAGE_SIZE[0]
        self.image_height = cfg.MODEL.IMAGE_SIZE[1]
        self.aspect_ratio = self.image_width * 1.0 / self.image_height
        self.pixel_std = 200
        self.root = cfg.DATASET.ROOT
        # self.scale_thre = cfg.TEST.SCALE_THRE

        # self.dataset_type = dataset_type
        # self.coco_WL = COCO(self._get_anno_file_keypoint()[0])
        # self.coco_LL = COCO(self._get_anno_file_keypoint()[1])
        self.coco = COCO(self._get_anno_file_keypoint())
        # self.ids_WL = list(self.coco_WL.imgs.keys())
        self.ids = list(self.coco.imgs.keys())
        self.transform = transform

        cats = [cat['name']
                for cat in self.coco.loadCats(self.coco.getCatIds())]
        self.classes = ['__background__'] + cats
        logger.info('=> classes: {}'.format(self.classes))
        self.num_classes = len(self.classes)
        self._class_to_ind = dict(zip(self.classes, range(self.num_classes)))
        self._class_to_coco_ind = dict(zip(cats, self.coco.getCatIds()))
        self._coco_ind_to_class_ind = dict(
            [
                (self._class_to_coco_ind[cls], self._class_to_ind[cls])
                for cls in self.classes[1:]
            ]
        )

        # load image file names
        self.image_set_index = self._load_image_set_index()
        self.num_images = len(self.image_set_index)
        logger.info('=> num_images: {}'.format(self.num_images))

        self.num_joints = 14
        self.flip_pairs = [[0, 1], [2, 3], [4, 5], [6, 7],
                           [8, 9], [10, 11]]
        self.parent_ids = None
        self.upper_body_ids = (0, 1, 2, 3, 4, 5, 12, 13)
        self.lower_body_ids = (6, 7, 8, 9, 10, 11)

        self.joints_weight = np.array(
            [
                1., 1., 1.2, 1.2,
                1.5, 1.5, 1., 1.,
                1.2, 1.2, 1.5, 1.5,
                1., 1.
            ],
            dtype=np.float32
        ).reshape((self.num_joints, 1))

        self.db = self._get_db()

        if is_train and cfg.DATASET.SELECT_DATA:
            self.db = self.select_data(self.db)

        logger.info('=> load {} samples'.format(len(self.db)))

        return

    def _load_image_set_index(self):
        """ image id: int """
        image_ids = self.coco.getImgIds()
        return image_ids

    def _get_anno_file_keypoint(self):
        """ self.root / annotations / person_keypoints_train2017.json """
        prefix = 'ExLPose' \
            if 'test' not in self.image_set else 'ExLPose'
        return os.path.join(
            self.root,
            'Annotations',
            prefix + '_' + self.image_set + '.json'
        )

    def _get_db(self):
        if self.is_train or self.use_gt_bbox:
            # use ground truth bbox
            gt_db = self._load_coco_keypoint_annotations()
        else:
            # use bbox from detection
            gt_db = self._load_coco_person_detection_results()
        return gt_db

    def _load_coco_keypoint_annotations(self):
        """ ground truth bbox and keypoints """
        gt_db = []
        for index in self.image_set_index:
            gt_db.extend(self._load_coco_keypoint_annotation_kernal(index))
        return gt_db

    # def _get_image_path(self, file_name):
    #     # return os.path.join(self.image_dir, file_name)
    #     images_dir = os.path.join(self.root, 'ExLPose')
    #     return os.path.join(images_dir, file_name)

    def image_path_from_index(self, index):
        """ example: images / train2017 / 000000119993.jpg """
        # print('index',index)
        # file_name = '%012d.jpg' % index
        # print('file_name', file_name)
        # load well-light image
        # coco_WL = self.coco_WL
        # img_id_WL = self.ids_WL[index]
        # ann_ids_WL = coco_WL.getAnnIds(imgIds=img_id_WL)
        # target_WL = coco_WL.loadAnns(ann_ids_WL)
        # image_info_WL = coco_WL.loadImgs(img_id_WL)[0]
        # file_name_WL = image_info_WL['file_name']

        # load unpaired low-lit image during training
        coco_LL = self.coco
        index_LL = np.random.randint(len(self.ids))
        img_id_LL = self.ids[index_LL]

        ann_ids_LL = coco_LL.getAnnIds(imgIds=img_id_LL)
        # target_LL = coco_LL.loadAnns(ann_ids_LL)
        image_info_LL = coco_LL.loadImgs(img_id_LL)[0]
        file_name_LL = image_info_LL['file_name']

        # image_path_wl = os.path.join(self.root, file_name_WL)
        image_path_ll = os.path.join(self.root, file_name_LL)

        return image_path_ll

    def _load_coco_keypoint_annotation_kernal(self, index):
        """
        coco ann: [u'segmentation', u'area', u'iscrowd', u'image_id', u'bbox', u'category_id', u'id']
        iscrowd:
            crowd instances are handled by marking their overlaps with all categories to -1
            and later excluded in training
        bbox:
            [x1, y1, w, h]
        :param index: coco image id
        :return: db entry
        """
        # im_ann_wl = self.coco.loadImgs(index)[0]
        im_ann_ll = self.coco.loadImgs(index)

        # print :im_ann_ll:im_ann_ll[0]
        # print('im_ann_ll[0]',im_ann_ll[0])
        #im_ann_ll[0] {'file_name': 'dark/imgs_0209_vid000011_exp1200_dark_000052__gain_5.60_exposure_333.png', 'id': 2527, 'height': 1199, 'width': 1919, 'crowdIndex': 0}

        #print :im_ann_ll
        # print('im_ann_ll',im_ann_ll)
        #im_ann_ll [{'file_name': 'dark/imgs_0209_vid000011_exp1200_dark_000052__gain_5.60_exposure_333.png', 'id': 2527, 'height': 1199, 'width': 1919, 'crowdIndex': 0}]
        width = im_ann_ll[0]['width']
        height = im_ann_ll[0]['height']
        # image_id=im_ann_ll[0]['image_id']

        annIds = self.coco.getAnnIds(imgIds=index, iscrowd=False)
        objs = self.coco.loadAnns(annIds)
        # print('objs',objs)
        # objs[{'num_keypoints': 13, 'iscrowd': 0,
        #       'keypoints': [1171.24, 545.66, 2, 1195.69, 545.66, 2, 0, 0, 0, 1236.45, 586.41, 2, 1255.47, 564.68, 2,
        #                     1277.2, 567.39, 2, 1192.98, 635.32, 2, 1214.71, 640.75, 2, 1214.71, 733.13, 2, 1222.86,
        #                     733.13, 2, 1217.43, 806.49, 2, 1217.43, 809.2, 2, 1192.98, 491.32, 2, 1190.26, 532.07, 2],
        #       'image_id': 675, 'bbox': [1157.04, 487.24, 117.05999999999995, 346.77], 'category_id': 1, 'id': 934}, {
        #          'num_keypoints': 14, 'iscrowd': 0,
        #          'keypoints': [1013.08, 524.59, 2, 1068.17, 518.79, 2, 1004.38, 591.28, 2, 1091.36, 565.18, 2, 1004.38,
        #                        649.27, 2, 1091.36, 608.68, 2, 1027.57, 620.28, 2, 1065.27, 620.28, 2, 1033.37, 707.26,
        #                        2, 1071.07, 704.36, 2, 1039.17, 785.55, 2, 1065.27, 782.65, 2, 1050.77, 455.0, 2,
        #                        1044.97, 501.39, 2], 'image_id': 675,
        #          'bbox': [996.75, 447.75, 92.54999999999995, 370.15], 'category_id': 1, 'id': 935}, {
        #          'num_keypoints': 14, 'iscrowd': 0,
        #          'keypoints': [938.28, 632.51, 2, 990.4, 632.51, 2, 929.6, 672.47, 2, 1004.3, 674.21, 2, 933.07, 702.0,
        #                        2, 1000.83, 696.79, 2, 950.44, 714.17, 2, 985.19, 714.17, 2, 957.39, 757.6, 2, 983.45,
        #                        757.6, 2, 960.87, 794.08, 2, 979.98, 794.08, 2, 964.34, 576.92, 2, 964.34, 616.88, 2],
        #          'image_id': 675, 'bbox': [931.86, 586.48, 76.12, 221.37], 'category_id': 1, 'id': 936}, {
        #          'num_keypoints': 6, 'iscrowd': 0,
        #          'keypoints': [0, 0, 0, 310.4, 581.7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319.1, 683.5, 2, 354.8,
        #                        682.1, 2, 0, 0, 0, 338.9, 754.5, 2, 0, 0, 0, 343.2, 831.3, 2, 0, 0, 0, 286.8, 574.0, 2],
        #          'image_id': 675, 'bbox': [278.3, 560.83, 91.75, 294.74], 'category_id': 1, 'id': 937}, {
        #          'num_keypoints': 14, 'iscrowd': 0,
        #          'keypoints': [800.73, 497.26, 2, 704.74, 504.94, 2, 831.45, 562.54, 2, 681.7, 570.22, 2, 816.09,
        #                        589.42, 2, 735.46, 585.58, 2, 796.89, 643.17, 2, 735.46, 647.01, 2, 796.89, 735.33, 2,
        #                        743.13, 743.01, 2, 777.69, 808.28, 2, 758.49, 835.16, 2, 750.81, 408.95, 2, 750.81,
        #                        478.06, 2], 'image_id': 675, 'bbox': [668.02, 399.45, 172.63, 477.93], 'category_id': 1,
        #          'id': 938}, {'num_keypoints': 12, 'iscrowd': 0,
        #                       'keypoints': [384.14, 555.52, 2, 459.02, 558.52, 2, 375.15, 609.44, 2, 465.01, 612.44, 2,
        #                                     0, 0, 0, 0, 0, 0, 402.11, 669.35, 2, 444.05, 663.36, 2, 399.12, 741.23, 2,
        #                                     441.05, 738.24, 2, 405.11, 819.11, 2, 435.06, 816.12, 2, 414.09, 486.63, 2,
        #                                     420.08, 528.57, 2], 'image_id': 675,
        #                       'bbox': [350.28, 476.15, 123.63000000000005, 382.4], 'category_id': 1, 'id': 939}, {
        #          'num_keypoints': 12, 'iscrowd': 0,
        #          'keypoints': [1081.23, 550.46, 2, 1124.05, 550.46, 2, 0, 0, 0, 1161.15, 581.86, 2, 0, 0, 0, 1149.74,
        #                        541.9, 2, 1089.79, 647.52, 2, 1129.76, 650.37, 2, 1115.48, 727.44, 2, 1135.46, 730.3, 2,
        #                        1122.2, 814.1, 2, 1130.9, 811.8, 2, 1109.77, 487.67, 2, 1106.92, 533.34, 2],
        #          'image_id': 675, 'bbox': [1062.76, 483.38, 118.72000000000003, 364.38], 'category_id': 1, 'id': 940}, {
        #          'num_keypoints': 14, 'iscrowd': 0,
        #          'keypoints': [927.8, 528.25, 2, 843.73, 525.01, 2, 950.44, 589.68, 2, 814.63, 579.98, 2, 934.27,
        #                        644.66, 2, 827.56, 647.89, 2, 914.87, 651.12, 2, 856.67, 651.12, 2, 914.87, 735.19, 2,
        #                        885.77, 728.73, 2, 901.94, 809.57, 2, 895.47, 825.73, 2, 876.07, 453.88, 2, 882.53,
        #                        512.08, 2], 'image_id': 675, 'bbox': [821.0, 449.03, 144.70000000000005, 412.89],
        #          'category_id': 1, 'id': 941}, {'num_keypoints': 5, 'iscrowd': 0,
        #                                         'keypoints': [492.7, 521.0, 2, 480.16, 510.64, 2, 495.5, 587.2, 2, 0, 0,
        #                                                       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        #                                                       0, 0, 0, 0, 0, 0, 431.6, 470.7, 2, 467.6, 506.2, 2],
        #                                         'image_id': 675,
        #                                         'bbox': [422.0, 462.48, 95.29999999999995, 246.51999999999998],
        #                                         'category_id': 1, 'id': 942}]

        # sanitize bboxes
        valid_objs = []
        for obj in objs:

            x, y, w, h = obj['bbox']
            x1 = np.max((0, x))
            y1 = np.max((0, y))
            x2 = np.min((width - 1, x1 + np.max((0, w - 1))))
            y2 = np.min((height - 1, y1 + np.max((0, h - 1))))
            if x2 >= x1 and y2 >= y1:
                obj['clean_bbox'] = [x1, y1, x2 - x1, y2 - y1]
                valid_objs.append(obj)
        objs = valid_objs

        rec = []
        for obj in objs:
            image_id=obj['image_id']
            print('image_id',image_id)#image_id 0,image_id 2
            cls = self._coco_ind_to_class_ind[obj['category_id']]
            if cls != 1:
                continue

            # ignore objs without keypoints annotation
            if max(obj['keypoints']) == 0:
                continue

            joints_3d = np.zeros((self.num_joints, 3), dtype=np.float)
            joints_3d_vis = np.zeros((self.num_joints, 3), dtype=np.float)
            for ipt in range(self.num_joints):
                joints_3d[ipt, 0] = obj['keypoints'][ipt * 3 + 0]
                joints_3d[ipt, 1] = obj['keypoints'][ipt * 3 + 1]
                joints_3d[ipt, 2] = 0
                t_vis = obj['keypoints'][ipt * 3 + 2]
                if t_vis > 1:
                    t_vis = 1
                joints_3d_vis[ipt, 0] = t_vis
                joints_3d_vis[ipt, 1] = t_vis
                joints_3d_vis[ipt, 2] = 0

            center, scale = self._box2cs(obj['clean_bbox'][:4])
            # image_file_name = im_ann_ll['file_name'].split('/')[-1]
            # image_path = os.path.join(self.image_dir, image_file_name)
            print('self.image_path_from_index(index)',self.image_path_from_index(index))

            rec.append({
                'image': self.image_path_from_index(index),
                'image_id': image_id,
                'center': center,
                'scale': scale,
                'joints_3d': joints_3d,
                'joints_3d_vis': joints_3d_vis,
                'filename': '',
                'imgnum': 0,
                # 'annotation_id': obj['id']
            })

        return rec

    def _box2cs(self, box):
        x, y, w, h = box[:4]
        return self._xywh2cs(x, y, w, h)

    def _xywh2cs(self, x, y, w, h):
        center = np.zeros((2), dtype=np.float32)
        center[0] = x + w * 0.5
        center[1] = y + h * 0.5

        if w > self.aspect_ratio * h:
            h = w * 1.0 / self.aspect_ratio
        elif w < self.aspect_ratio * h:
            w = h * self.aspect_ratio
        scale = np.array(
            [w * 1.0 / self.pixel_std, h * 1.0 / self.pixel_std],
            dtype=np.float32)
        if center[0] != -1:
            scale = scale * 1.25
            # scale = scale * self.scale_thre

        return center, scale

    def _load_coco_person_detection_results(self):
        all_boxes = None
        with open(self.bbox_file, 'r') as f:
            all_boxes = json.load(f)

        if not all_boxes:
            logger.error('=> Load %s fail!' % self.bbox_file)
            return None

        logger.info('=> Total boxes: {}'.format(len(all_boxes)))

        kpt_db = []
        num_boxes = 0
        for n_img in range(0, len(all_boxes)):
            det_res = all_boxes[n_img]
            if det_res['category_id'] != 1:
                continue
            img_name = self.image_path_from_index(det_res['image_id'])
            image_id = det_res['image_id']
            box = det_res['bbox']
            score = det_res['score']

            if score < self.image_thre:
                continue

            num_boxes = num_boxes + 1

            center, scale = self._box2cs(box)
            joints_3d = np.zeros((self.num_joints, 3), dtype=np.float)
            joints_3d_vis = np.ones(
                (self.num_joints, 3), dtype=np.float)
            kpt_db.append({
                'image': img_name,
                'image_id': image_id,
                'center': center,
                'scale': scale,
                'score': score,
                'joints_3d': joints_3d,
                'joints_3d_vis': joints_3d_vis,
            })

        logger.info('=> Total boxes after filter low score@{}: {}'.format(
            self.image_thre, num_boxes))
        return kpt_db



    def __repr__(self):
        fmt_str = 'Dataset ' + self.__class__.__name__ + '\n'
        fmt_str += '    Number of datapoints: {}\n'.format(self.__len__())
        fmt_str += '    Root Location: {}\n'.format(self.root)
        # tmp = '    Transforms (if any): '
        # fmt_str += '{0}{1}\n'.format(tmp, self.transform.__repr__().replace('\n', '\n' + ' ' * len(tmp)))
        # tmp = '    Target Transforms (if any): '
        # fmt_str += '{0}{1}'.format(tmp, self.target_transform.__repr__().replace('\n', '\n' + ' ' * len(tmp)))
        return fmt_str

    def processKeypoints(self, keypoints):
        tmp = keypoints.copy()
        if keypoints[:, 2].max() > 0:
            p = keypoints[keypoints[:, 2] > 0][:, :2].mean(axis=0)
            num_keypoints = keypoints.shape[0]
            for i in range(num_keypoints):
                tmp[i][0:3] = [
                    float(keypoints[i][0]),
                    float(keypoints[i][1]),
                    float(keypoints[i][2])
                ]

        return tmp

    # def evaluate(self, cfg, preds, scores, output_dir,
    #              *args, **kwargs):
    def evaluate(self, cfg, preds, output_dir, all_boxes, image_id,
                 *args, **kwargs):
        rank = cfg.RANK

        # if all_boxes.shape[1] == 8:
        #     return self.evaluate_lambda(cfg, preds, output_dir, all_boxes, img_path, epoch, *args, **kwargs)

        # print('img_path', img_path)#'/media/zou/D/dataset/ExLPose/dark/imgs_0206_vid000012_exp400_dark_000052__gain_4.10_exposure_1250.png'
        res_folder = os.path.join(output_dir, 'results')
        if not os.path.exists(res_folder):
            try:
                os.makedirs(res_folder)
            except Exception:
                logger.error('Fail to make {}'.format(res_folder))

        res_file = os.path.join(
            res_folder, 'keypoints_{}_results_{}.json'.format(
                self.image_set, rank)
        )

        # person x (keypoints)
        _kpts = []
        for idx, kpt in enumerate(preds):
            # print('img_path[idx]', img_path[idx])
            kpt = self.processKeypoints(kpt)
            _kpts.append({
                'keypoints': kpt[:, 0:3],
                'center': all_boxes[idx][0:2],
                'scale': all_boxes[idx][2:4],
                'area': all_boxes[idx][4],
                'score': all_boxes[idx][5],
                'image_id': int(image_id[idx])
            })
        # image x person x (keypoints)
        kpts = defaultdict(list)
        for kpt in _kpts:
            kpts[kpt['image_id']].append(kpt)
#                                                                                        tensor(1815), tensor(1815),
                                                                                         tensor(2086), tensor(2086),
                                                                                         tensor(2086), tensor(2086),
                                                                                         tensor(2087), tensor(2087),
                                                                                         tensor(2087), tensor(2088),
                                                                                         tensor(2088), tensor(2088),
                                                                                         tensor(2089), tensor(2089),
                                                                                         tensor(2090), tensor(2090),
                                                                                         tensor(2090), tensor(2090),
                                                                                         tensor(2091), tensor(2091),
                                                                                         tensor(2091), tensor(2091),
                                                                                         tensor(2092), tensor(2092),
                                                                                         tensor(2092), tensor(2092),
                                                                                         tensor(2092), tensor(2093),
                                                                                         tensor(2093), tensor(2093),
                                                                                         tensor(2093), tensor(2094),
                                                                                         tensor(2094), tensor(2094),
                                                                                         tensor(2094), tensor(2095),
                                                                                         tensor(2095), tensor(2095),
                                                                                         tensor(2095), tensor(2096),
                                                                                         tensor(2096), tensor(2096),
                                                                                         tensor(2096), tensor(2097),
                                                                                         tensor(2097), tensor(2097),
                                                                                         tensor(2097), tensor(2098),
                                                                                         tensor(2098), tensor(2098),
                                                                                         tensor(2099), tensor(2099),
                                                                                         tensor(2099), tensor(2100),
                                                                                         tensor(2100), tensor(2100),
                                                                                         tensor(2100), tensor(2142),
                                                                                         tensor(2142), tensor(2142),
                                                                                         tensor(2142), tensor(2143),
                                                                                         tensor(2143), tensor(2143),
                                                                                         tensor(2143), tensor(2144),
                                                                                         tensor(2144), tensor(2145),
                                                                                         tensor(2145), tensor(2146),
                                                                                         tensor(2146), tensor(2147),
                                                                                         tensor(2147), tensor(2148),
                                                                                         tensor(2148), tensor(2149),
                                                                                         tensor(2149), tensor(2150),
                                                                                         tensor(2150), tensor(2150),
                                                                                         tensor(2151), tensor(2151),
                                                                                         tensor(2151), tensor(2152),
                                                                                         tensor(2152), tensor(2152),
                                                                                         tensor(2152), tensor(2153),
                                                                                         tensor(2153), tensor(2153),
                                                                                         tensor(2153), tensor(2153),
                                                                                         tensor(2154), tensor(2154),
                                                                                         tensor(2154), tensor(2154),
                                                                                         tensor(2159), tensor(2159),
                                                                                         tensor(2159), tensor(2159),
                                                                                         tensor(2159), tensor(2159),
                                                                                         tensor(2160), tensor(2160),
                                                                                         tensor(2160), tensor(2160),
                                                                                         tensor(2160), tensor(2161),
                                                                                         tensor(2161), tensor(2161),
                                                                                         tensor(2161), tensor(2161),
                                                                                         tensor(2162), tensor(2162),
                                                                                         tensor(2162), tensor(2163),
                                                                                         tensor(2163), tensor(2163),
                                                                                         tensor(2164), tensor(2164),
                                                                                         tensor(2164), tensor(2165),
                                                                                         tensor(2165), tensor(2165),
                                                                                         tensor(2166), tensor(2166),
                                                                                         tensor(2166), tensor(2166),
                                                                                         tensor(2167), tensor(2167),
                                                                                         tensor(2167), tensor(2167),
                                                                                         tensor(2168), tensor(2168),
                                                                                         tensor(2168), tensor(2168),
                                                                                         tensor(2168), tensor(2168),
                                                                                         tensor(2169), tensor(2169),
                                                                                         tensor(2169), tensor(2169),
                                                                                         tensor(2170), tensor(2170),
                                                                                         tensor(2170), tensor(2170),
                                                                                         tensor(2171), tensor(2171),
                                                                                         tensor(2171), tensor(2171),
                                                                                         tensor(2172), tensor(2172),
                                                                                         tensor(2172), tensor(2172),
                                                                                         tensor(2173), tensor(2173),
                                                                                         tensor(2173), tensor(2183),
                                                                                         tensor(2183), tensor(2183),
                                                                                         tensor(2183), tensor(2183),
                                                                                         tensor(2184), tensor(2184),
                                                                                         tensor(2185), tensor(2185),
                                                                                         tensor(2185), tensor(2185),
                                                                                         tensor(2186), tensor(2186),
                                                                                         tensor(2186), tensor(2186),
                                                                                         tensor(2186), tensor(2187),
                                                                                         tensor(2187), tensor(2187),
                                                                                         tensor(2188), tensor(2188),
                                                                                         tensor(2188), tensor(2188),
                                                                                         tensor(2188), tensor(2188),
                                                                                         tensor(2188), tensor(2188),
                                                                                         tensor(2188), tensor(2189),
                                                                                         tensor(2189), tensor(2189),
                                                                                         tensor(2189), tensor(2189),
                                                                                         tensor(2189), tensor(2190),
                                                                                         tensor(2190), tensor(2190),
                                                                                         tensor(2190), tensor(2190),
                                                                                         tensor(2190), tensor(2190),
                                                                                         tensor(2191), tensor(2191),
                                                                                         tensor(2191), tensor(2191),
                                                                                         tensor(2191), tensor(2192),
                                                                                         tensor(2192), tensor(2192),
                                                                                         tensor(2192), tensor(2193),
                                                                                         tensor(2193), tensor(2193),
                                                                                         tensor(2220), tensor(2220),
                                                                                         tensor(2220), tensor(2221),
                                                                                         tensor(2221), tensor(2221),
                                                                                         tensor(2222), tensor(2222),
                                                                                         tensor(2223), tensor(2223),
                                                                                         tensor(2224), tensor(2224),
                                                                                         tensor(2225), tensor(2225),
                                                                                         tensor(2225), tensor(2226),
                                                                                         tensor(2226), tensor(2226),
                                                                                         tensor(2226), tensor(2227),
                                                                                         tensor(2227), tensor(2227),
                                                                                         tensor(2227), tensor(2227),
                                                                                         tensor(2227), tensor(2228),
                                                                                         tensor(2228), tensor(2228),
                                                                                         tensor(2228), tensor(2228),
                                                                                         tensor(2228), tensor(2229),
                                                                                         tensor(2229), tensor(2229),
                                                                                         tensor(2230), tensor(2230),
                                                                                         tensor(2230), tensor(2231),
                                                                                         tensor(2231), tensor(2231),
                                                                                         tensor(2231), tensor(2232),
                                                                                         tensor(2232), tensor(2232),
                                                                                         tensor(2232), tensor(2232),
                                                                                         tensor(2232), tensor(2232),
                                                                                         tensor(2232), tensor(2232),
                                                                                         tensor(2232), tensor(2232),
                                                                                         tensor(2233), tensor(2233),
                                                                                         tensor(2233), tensor(2233),
                                                                                         tensor(2233), tensor(2233),
                                                                                         tensor(2233), tensor(2233),
                                                                                         tensor(2233), tensor(2234),
                                                                                         tensor(2234), tensor(2234),
                                                                                         tensor(2234), tensor(2234),
                                                                                         tensor(2234), tensor(2235),
                                                                                         tensor(2235), tensor(2235),
                                                                                         tensor(2236), tensor(2236),
                                                                                         tensor(2236), tensor(2236),
                                                                                         tensor(2237), tensor(2237),
                                                                                         tensor(2237), tensor(2399),
                                                                                         tensor(2399), tensor(2399),
                                                                                         tensor(2399), tensor(2400),
                                                                                         tensor(2400), tensor(2400),
                                                                                         tensor(2400), tensor(2401),
                                                                                         tensor(2401), tensor(2401),
                                                                                         tensor(2401), tensor(2402),
                                                                                         tensor(2402), tensor(2402),
                                                                                         tensor(2402), tensor(2403),
                                                                                         tensor(2403), tensor(2403),
                                                                                         tensor(2403), tensor(2404),
                                                                                         tensor(2404), tensor(2404),
                                                                                         tensor(2404), tensor(2405),
                                                                                         tensor(2405), tensor(2405),
                                                                                         tensor(2405), tensor(2406),
                                                                                         tensor(2406), tensor(2406),
                                                                                         tensor(2406), tensor(2407),
                                                                                         tensor(2407), tensor(2407),
                                                                                         tensor(2407), tensor(2408),
                                                                                         tensor(2408), tensor(2408),
                                                                                         tensor(2408), tensor(2409),
                                                                                         tensor(2409), tensor(2409),
                                                                                         tensor(2409), tensor(2410),
                                                                                         tensor(2410), tensor(2410),
                                                                                         tensor(2410), tensor(2411),
                                                                                         tensor(2411), tensor(2411),
                                                                                         tensor(2411), tensor(2412),
                                                                                         tensor(2412), tensor(2412),
                                                                                         tensor(2412), tensor(2413),
                                                                                         tensor(2413), tensor(2413),
                                                                                         tensor(2413), tensor(2471),
                                                                                         tensor(2472), tensor(2472),
                                                                                         tensor(2473), tensor(2473),
                                                                                         tensor(2474), tensor(2474),
                                                                                         tensor(2475), tensor(2475),
                                                                                         tensor(2476), tensor(2476),
                                                                                         tensor(2477), tensor(2477),
                                                                                         tensor(2478), tensor(2478),
                                                                                         tensor(2479), tensor(2479),
                                                                                         tensor(2480), tensor(2480),
                                                                                         tensor(2481), tensor(2482),
                                                                                         tensor(2482), tensor(2483),
                                                                                         tensor(2483), tensor(2484),
                                                                                         tensor(2484), tensor(2485),
                                                                                         tensor(2485), tensor(2515),
                                                                                         tensor(2515), tensor(2515),
                                                                                         tensor(2515), tensor(2516),
                                                                                         tensor(2516), tensor(2517),
                                                                                         tensor(2517), tensor(2518),
                                                                                         tensor(2518), tensor(2519),
                                                                                         tensor(2519), tensor(2520),
                                                                                         tensor(2520), tensor(2520),
                                                                                         tensor(2520), tensor(2521),
                                                                                         tensor(2521), tensor(2521),
                                                                                         tensor(2521), tensor(2522),
                                                                                         tensor(2522), tensor(2522),
                                                                                         tensor(2522), tensor(2523),
                                                                                         tensor(2523), tensor(2523),
                                                                                         tensor(2523), tensor(2523),
                                                                                         tensor(2523), tensor(2523),
                                                                                         tensor(2524), tensor(2524),
                                                                                         tensor(2524), tensor(2524),
                                                                                         tensor(2524), tensor(2524),
                                                                                         tensor(2525), tensor(2525),
                                                                                         tensor(2525), tensor(2525),
                                                                                         tensor(2525), tensor(2525),
                                                                                         tensor(2526), tensor(2526),
                                                                                         tensor(2526), tensor(2527),
                                                                                         tensor(2527), tensor(2527),
                                                                                         tensor(2527), tensor(2527),
                                                                                         tensor(2528), tensor(2528),
                                                                                         tensor(2528)]}]
            kpt[image_id][
                tensor(38), tensor(38), tensor(38), tensor(38), tensor(38), tensor(38), tensor(38), tensor(38), tensor(
                    38), tensor(38), tensor(39), tensor(39), tensor(39), tensor(39), tensor(39), tensor(39), tensor(
                    39), tensor(39), tensor(39), tensor(40), tensor(40), tensor(40), tensor(40), tensor(40), tensor(
                    40), tensor(40), tensor(40), tensor(40), tensor(40), tensor(41), tensor(41), tensor(41), tensor(
                    41), tensor(41), tensor(41), tensor(41), tensor(41), tensor(41), tensor(41), tensor(41), tensor(
                    42), tensor(42), tensor(42), tensor(42), tensor(42), tensor(42), tensor(42), tensor(42), tensor(
                    42), tensor(42), tensor(42), tensor(42), tensor(42), tensor(42), tensor(48), tensor(48), tensor(
                    48), tensor(48), tensor(48), tensor(48), tensor(49), tensor(49), tensor(49), tensor(49), tensor(
                    49), tensor(49), tensor(50), tensor(50), tensor(50), tensor(50), tensor(51), tensor(51), tensor(
                    51), tensor(51), tensor(51), tensor(51), tensor(52), tensor(52), tensor(52), tensor(52), tensor(
                    58), tensor(58), tensor(58), tensor(58), tensor(58), tensor(58), tensor(59), tensor(59), tensor(
                    59), tensor(59), tensor(59), tensor(60), tensor(60), tensor(60), tensor(60), tensor(60), tensor(
                    60), tensor(60), tensor(60), tensor(61), tensor(61), tensor(61), tensor(61), tensor(61), tensor(
                    61), tensor(62), tensor(62), tensor(62), tensor(62), tensor(62), tensor(62), tensor(62), tensor(
                    62), tensor(63), tensor(63), tensor(63), tensor(63), tensor(63), tensor(63), tensor(63), tensor(
                    63), tensor(63), tensor(63), tensor(64), tensor(64), tensor(64), tensor(64), tensor(64), tensor(
                    64), tensor(64), tensor(64), tensor(64), tensor(64), tensor(64), tensor(65), tensor(65), tensor(
                    65), tensor(65), tensor(65), tensor(65), tensor(65), tensor(65), tensor(65), tensor(65), tensor(
                    65), tensor(65), tensor(65), tensor(65), tensor(65), tensor(65), tensor(65), tensor(65), tensor(
                    65), tensor(65), tensor(66), tensor(66), tensor(66), tensor(66), tensor(66), tensor(66), tensor(
                    66), tensor(66), tensor(66), tensor(67), tensor(67), tensor(67), tensor(67), tensor(67), tensor(
                    67), tensor(67), tensor(67), tensor(67), tensor(67), tensor(67), tensor(67), tensor(67), tensor(
                    67), tensor(67), tensor(67), tensor(67), tensor(67), tensor(108), tensor(108), tensor(108), tensor(
                    108), tensor(108), tensor(108), tensor(108), tensor(108), tensor(108), tensor(108), tensor(
                    108), tensor(108), tensor(108), tensor(109), tensor(109), tensor(109), tensor(109), tensor(
                    109), tensor(109), tensor(109), tensor(109), tensor(110), tensor(110), tensor(110), tensor(
                    110), tensor(110), tensor(110), tensor(110), tensor(110), tensor(110), tensor(110), tensor(
                    111), tensor(111), tensor(111), tensor(111), tensor(111), tensor(111), tensor(111), tensor(
                    112), tensor(112), tensor(112), tensor(112), tensor(112), tensor(112), tensor(112), tensor(
                    112), tensor(118), tensor(118), tensor(118), tensor(118), tensor(118), tensor(119), tensor(
                    119), tensor(119), tensor(119), tensor(119), tensor(119), tensor(119), tensor(119), tensor(
                    119), tensor(120), tensor(120), tensor(120), tensor(120), tensor(120), tensor(120), tensor(
                    120), tensor(121), tensor(121), tensor(121), tensor(121), tensor(122), tensor(122), tensor(
                    122), tensor(122), tensor(122), tensor(122), tensor(133), tensor(133), tensor(133), tensor(
                    133), tensor(134), tensor(134), tensor(134), tensor(134), tensor(134), tensor(135), tensor(
                    135), tensor(135), tensor(135), tensor(135), tensor(135), tensor(135), tensor(136), tensor(
                    136), tensor(136), tensor(136), tensor(137), tensor(137), tensor(137), tensor(137), tensor(
                    137), tensor(148), tensor(148), tensor(148), tensor(148), tensor(148), tensor(148), tensor(
                    149), tensor(149), tensor(149), tensor(149), tensor(149), tensor(149), tensor(150), tensor(
                    150), tensor(150), tensor(150), tensor(150), tensor(150), tensor(150), tensor(151), tensor(
                    151), tensor(151), tensor(151), tensor(151), tensor(151), tensor(151), tensor(152), tensor(
                    152), tensor(152), tensor(152), tensor(152), tensor(172), tensor(172), tensor(172), tensor(
                    173), tensor(173), tensor(173), tensor(174), tensor(174), tensor(175), tensor(176), tensor(
                    176), tensor(199), tensor(200), tensor(201), tensor(202), tensor(202), tensor(203), tensor(
                    203), tensor(224), tensor(224), tensor(225), tensor(225), tensor(226), tensor(226), tensor(
                    227), tensor(227), tensor(228), tensor(228), tensor(234), tensor(236), tensor(236), tensor(
                    236), tensor(236), tensor(236), tensor(236), tensor(236), tensor(236), tensor(236), tensor(
                    236), tensor(237), tensor(237), tensor(237), tensor(237), tensor(237), tensor(237), tensor(
                    237), tensor(237), tensor(237), tensor(238), tensor(238), tensor(238), tensor(238), tensor(
                    238), tensor(238), tensor(238), tensor(238), tensor(238), tensor(239), tensor(239), tensor(
                    239), tensor(239), tensor(239), tensor(239), tensor(239), tensor(239), tensor(239), tensor(
                    239), tensor(239), tensor(239), tensor(239), tensor(239), tensor(239), tensor(239), tensor(
                    239), tensor(240), tensor(240), tensor(240), tensor(240), tensor(240), tensor(240), tensor(
                    240), tensor(240), tensor(240), tensor(240), tensor(256), tensor(256), tensor(256), tensor(
                    256), tensor(256), tensor(256), tensor(256), tensor(256), tensor(256), tensor(257), tensor(
                    257), tensor(257), tensor(257), tensor(257), tensor(257), tensor(257), tensor(257), tensor(
                    257), tensor(257), tensor(257), tensor(257), tensor(257), tensor(257), tensor(258), tensor(
                    258), tensor(258), tensor(258), tensor(258), tensor(258), tensor(258), tensor(258), tensor(
                    258), tensor(258), tensor(258), tensor(259), tensor(259), tensor(259), tensor(259), tensor(
                    259), tensor(259), tensor(259), tensor(259), tensor(259), tensor(259), tensor(259), tensor(
                    259), tensor(259), tensor(260), tensor(260), tensor(260), tensor(260), tensor(260), tensor(
                    260), tensor(260), tensor(260), tensor(260), tensor(260), tensor(260), tensor(260), tensor(
                    266), tensor(266), tensor(266), tensor(266), tensor(266), tensor(266), tensor(266), tensor(
                    266), tensor(266), tensor(267), tensor(267), tensor(267), tensor(267), tensor(267), tensor(
                    267), tensor(267), tensor(267), tensor(267), tensor(268), tensor(268), tensor(268), tensor(
                    268), tensor(268), tensor(268), tensor(268), tensor(268), tensor(268), tensor(268), tensor(
                    269), tensor(269), tensor(269), tensor(269), tensor(269), tensor(269), tensor(269), tensor(
                    269), tensor(269), tensor(269), tensor(269), tensor(269), tensor(270), tensor(270), tensor(
                    270), tensor(270), tensor(270), tensor(270), tensor(270), tensor(270), tensor(270), tensor(
                    270), tensor(270), tensor(270), tensor(270), tensor(270), tensor(270), tensor(270), tensor(
                    270), tensor(281), tensor(281), tensor(281), tensor(281), tensor(281), tensor(282), tensor(
                    282), tensor(282), tensor(282), tensor(283), tensor(283), tensor(283), tensor(283), tensor(
                    284), tensor(284), tensor(284), tensor(284), tensor(285), tensor(285), tensor(285), tensor(
                    285), tensor(341), tensor(341), tensor(341), tensor(341), tensor(341), tensor(341), tensor(
                    341), tensor(341), tensor(341), tensor(341), tensor(341), tensor(361), tensor(361), tensor(
                    361), tensor(361), tensor(361), tensor(361), tensor(361), tensor(361), tensor(362), tensor(
                    362), tensor(362), tensor(362), tensor(362), tensor(362), tensor(362), tensor(362), tensor(
                    362), tensor(363), tensor(363), tensor(363), tensor(363), tensor(363), tensor(363), tensor(
                    363), tensor(363), tensor(363), tensor(364), tensor(364), tensor(364), tensor(364), tensor(
                    364), tensor(364), tensor(364), tensor(385), tensor(385), tensor(385), tensor(386), tensor(
                    386), tensor(386), tensor(387), tensor(387), tensor(387), tensor(387), tensor(388), tensor(
                    388), tensor(388), tensor(388), tensor(388), tensor(389), tensor(389), tensor(389), tensor(
                    389), tensor(425), tensor(425), tensor(425), tensor(425), tensor(425), tensor(425), tensor(
                    425), tensor(426), tensor(426), tensor(426), tensor(426), tensor(426), tensor(426), tensor(
                    426), tensor(426), tensor(426), tensor(426), tensor(426), tensor(427), tensor(427), tensor(
                    427), tensor(427), tensor(427), tensor(427), tensor(427), tensor(428), tensor(428), tensor(
                    428), tensor(428), tensor(428), tensor(428), tensor(428), tensor(428), tensor(428), tensor(
                    428), tensor(429), tensor(429), tensor(429), tensor(429), tensor(445), tensor(445), tensor(
                    446), tensor(446), tensor(447), tensor(447), tensor(448), tensor(448), tensor(449), tensor(
                    449), tensor(464), tensor(464), tensor(464), tensor(464), tensor(464), tensor(464), tensor(
                    464), tensor(464), tensor(465), tensor(465), tensor(465), tensor(465), tensor(465), tensor(
                    465), tensor(465), tensor(465), tensor(466), tensor(466), tensor(466), tensor(466), tensor(
                    466), tensor(466), tensor(466), tensor(466), tensor(467), tensor(467), tensor(467), tensor(
                    467), tensor(467), tensor(467), tensor(467), tensor(467), tensor(467), tensor(467), tensor(
                    467), tensor(468), tensor(468), tensor(468), tensor(468), tensor(468), tensor(482), tensor(
                    482), tensor(482), tensor(482), tensor(482), tensor(482), tensor(482), tensor(482), tensor(
                    482), tensor(483), tensor(483), tensor(483), tensor(483), tensor(483), tensor(483), tensor(
                    483), tensor(484), tensor(484), tensor(484), tensor(484), tensor(484), tensor(484), tensor(
                    484), tensor(484), tensor(484), tensor(485), tensor(485), tensor(485), tensor(485), tensor(
                    485), tensor(486), tensor(486), tensor(486), tensor(486), tensor(486), tensor(502), tensor(
                    502), tensor(502), tensor(502), tensor(502), tensor(502), tensor(502), tensor(503), tensor(
                    503), tensor(503), tensor(503), tensor(504), tensor(504), tensor(504), tensor(504), tensor(
                    504), tensor(504), tensor(505), tensor(505), tensor(505), tensor(505), tensor(505), tensor(
                    505), tensor(505), tensor(505), tensor(506), tensor(506), tensor(506), tensor(506), tensor(
                    506), tensor(506), tensor(506), tensor(506), tensor(522), tensor(522), tensor(522), tensor(
                    522), tensor(523), tensor(523), tensor(523), tensor(523), tensor(523), tensor(523), tensor(
                    523), tensor(523), tensor(524), tensor(524), tensor(524), tensor(524), tensor(524), tensor(
                    524), tensor(524), tensor(525), tensor(525), tensor(525), tensor(525), tensor(525), tensor(
                    525), tensor(525), tensor(525), tensor(525), tensor(526), tensor(526), tensor(526), tensor(
                    526), tensor(526), tensor(526), tensor(526), tensor(547), tensor(547), tensor(547), tensor(
                    547), tensor(547), tensor(547), tensor(547), tensor(547), tensor(548), tensor(548), tensor(
                    548), tensor(548), tensor(548), tensor(548), tensor(548), tensor(548), tensor(549), tensor(
                    549), tensor(549), tensor(549), tensor(549), tensor(550), tensor(550), tensor(550), tensor(
                    550), tensor(550), tensor(550), tensor(550), tensor(569), tensor(569), tensor(569), tensor(
                    569), tensor(569), tensor(569), tensor(569), tensor(569), tensor(569), tensor(570), tensor(
                    570), tensor(570), tensor(570), tensor(570), tensor(570), tensor(571), tensor(571), tensor(
                    571), tensor(571), tensor(571), tensor(571), tensor(571), tensor(571), tensor(571), tensor(
                    571), tensor(571), tensor(572), tensor(572), tensor(572), tensor(572), tensor(572), tensor(
                    572), tensor(572), tensor(572), tensor(572), tensor(572), tensor(576), tensor(577), tensor(
                    578), tensor(579), tensor(667), tensor(667), tensor(667), tensor(667), tensor(667), tensor(
                    667), tensor(667), tensor(667), tensor(667), tensor(667), tensor(668), tensor(668), tensor(
                    668), tensor(668), tensor(668), tensor(668), tensor(668), tensor(668), tensor(669), tensor(
                    669), tensor(669), tensor(669), tensor(669), tensor(669), tensor(669), tensor(669), tensor(
                    669), tensor(669), tensor(670), tensor(670), tensor(670), tensor(670), tensor(670), tensor(
                    670), tensor(670), tensor(670), tensor(670), tensor(670), tensor(671), tensor(671), tensor(
                    671), tensor(671), tensor(671), tensor(671), tensor(671), tensor(671), tensor(671), tensor(
                    672), tensor(672), tensor(672), tensor(672), tensor(672), tensor(672), tensor(672), tensor(
                    673), tensor(673), tensor(673), tensor(673), tensor(673), tensor(673), tensor(673), tensor(
                    674), tensor(674), tensor(674), tensor(674), tensor(674), tensor(674), tensor(674), tensor(
                    674), tensor(674), tensor(675), tensor(675), tensor(675), tensor(675), tensor(675), tensor(
                    675), tensor(675), tensor(675), tensor(675), tensor(676), tensor(676), tensor(676), tensor(
                    676), tensor(676), tensor(676), tensor(676), tensor(676), tensor(677), tensor(677), tensor(
                    677), tensor(677), tensor(677), tensor(677), tensor(677), tensor(677), tensor(678), tensor(
                    678), tensor(678), tensor(678), tensor(678), tensor(678), tensor(678), tensor(678), tensor(
                    678), tensor(679), tensor(679), tensor(679), tensor(679), tensor(679), tensor(679), tensor(
                    679), tensor(679), tensor(679), tensor(679), tensor(680), tensor(680), tensor(680), tensor(
                    680), tensor(680), tensor(680), tensor(680), tensor(680), tensor(680), tensor(681), tensor(
                    681), tensor(681), tensor(681), tensor(681), tensor(681), tensor(681), tensor(681), tensor(
                    681), tensor(682), tensor(682), tensor(682), tensor(682), tensor(682), tensor(682), tensor(
                    682), tensor(682), tensor(682), tensor(682), tensor(683), tensor(683), tensor(683), tensor(
                    683), tensor(683), tensor(683), tensor(683), tensor(683), tensor(683), tensor(684), tensor(
                    684), tensor(684), tensor(684), tensor(684), tensor(685), tensor(685), tensor(685), tensor(
                    685), tensor(686), tensor(686), tensor(686), tensor(686), tensor(687), tensor(687), tensor(
                    687), tensor(687), tensor(688), tensor(688), tensor(688), tensor(688), tensor(688), tensor(
                    688), tensor(688), tensor(689), tensor(689), tensor(689), tensor(689), tensor(689), tensor(
                    689), tensor(690), tensor(690), tensor(690), tensor(690), tensor(690), tensor(690), tensor(
                    690), tensor(690), tensor(690), tensor(691), tensor(691), tensor(691), tensor(691), tensor(
                    691), tensor(691), tensor(691), tensor(691), tensor(692), tensor(692), tensor(692), tensor(
                    692), tensor(692), tensor(692), tensor(692), tensor(692), tensor(692), tensor(692), tensor(
                    693), tensor(693), tensor(693), tensor(693), tensor(693), tensor(693), tensor(693), tensor(
                    693), tensor(694), tensor(694), tensor(694), tensor(694), tensor(694), tensor(694), tensor(
                    694), tensor(694), tensor(695), tensor(695), tensor(695), tensor(695), tensor(695), tensor(
                    695), tensor(695), tensor(695), tensor(695), tensor(903), tensor(904), tensor(905), tensor(
                    906), tensor(907), tensor(908), tensor(909), tensor(910), tensor(911), tensor(912), tensor(
                    913), tensor(914), tensor(915), tensor(916), tensor(917), tensor(918), tensor(919), tensor(
                    920), tensor(921), tensor(922), tensor(923), tensor(924), tensor(925), tensor(926), tensor(
                    927), tensor(928), tensor(929), tensor(930), tensor(931), tensor(932), tensor(938), tensor(
                    938), tensor(938), tensor(939), tensor(939), tensor(939), tensor(940), tensor(940), tensor(
                    940), tensor(941), tensor(941), tensor(941), tensor(942), tensor(942), tensor(942), tensor(
                    943), tensor(943), tensor(943), tensor(944), tensor(944), tensor(944), tensor(945), tensor(
                    945), tensor(945), tensor(946), tensor(946), tensor(946), tensor(947), tensor(947), tensor(
                    947), tensor(948), tensor(948), tensor(948), tensor(1177), tensor(1177), tensor(1177), tensor(
                    1177), tensor(1178), tensor(1178), tensor(1178), tensor(1178), tensor(1179), tensor(1179), tensor(
                    1179), tensor(1179), tensor(1180), tensor(1180), tensor(1180), tensor(1180), tensor(1181), tensor(
                    1181), tensor(1181), tensor(1181), tensor(1197), tensor(1197), tensor(1197), tensor(1198), tensor(
                    1198), tensor(1198), tensor(1199), tensor(1199), tensor(1199), tensor(1200), tensor(1200), tensor(
                    1200), tensor(1201), tensor(1201), tensor(1201), tensor(1288), tensor(1288), tensor(1289), tensor(
                    1289), tensor(1290), tensor(1290), tensor(1291), tensor(1291), tensor(1292), tensor(1292), tensor(
                    1293), tensor(1293), tensor(1294), tensor(1294), tensor(1295), tensor(1295), tensor(1296), tensor(
                    1296), tensor(1297), tensor(1297), tensor(1298), tensor(1298), tensor(1298), tensor(1299), tensor(
                    1299), tensor(1299), tensor(1300), tensor(1300), tensor(1300), tensor(1301), tensor(1301), tensor(
                    1301), tensor(1302), tensor(1302), tensor(1302), tensor(1303), tensor(1303), tensor(1303), tensor(
                    1304), tensor(1304), tensor(1304), tensor(1305), tensor(1305), tensor(1305), tensor(1306), tensor(
                    1306), tensor(1306), tensor(1307), tensor(1307), tensor(1308), tensor(1308), tensor(1309), tensor(
                    1309), tensor(1310), tensor(1310), tensor(1310), tensor(1310), tensor(1310), tensor(1310), tensor(
                    1311), tensor(1311), tensor(1311), tensor(1311), tensor(1311), tensor(1311), tensor(1311), tensor(
                    1312), tensor(1312), tensor(1312), tensor(1312), tensor(1312), tensor(1312), tensor(1312), tensor(
                    1312), tensor(1313), tensor(1313), tensor(1313), tensor(1313), tensor(1313), tensor(1313), tensor(
                    1313), tensor(1314), tensor(1314), tensor(1314), tensor(1314), tensor(1314), tensor(1314), tensor(
                    1314), tensor(1315), tensor(1315), tensor(1315), tensor(1315), tensor(1315), tensor(1315), tensor(
                    1316), tensor(1316), tensor(1316), tensor(1316), tensor(1317), tensor(1317), tensor(1317), tensor(
                    1317), tensor(1317), tensor(1318), tensor(1318), tensor(1318), tensor(1318), tensor(1319), tensor(
                    1319), tensor(1319), tensor(1319), tensor(1319), tensor(1319), tensor(1319), tensor(1319), tensor(
                    1320), tensor(1320), tensor(1320), tensor(1320), tensor(1320), tensor(1320), tensor(1320), tensor(
                    1321), tensor(1321), tensor(1321), tensor(1321), tensor(1321), tensor(1321), tensor(1337), tensor(
                    1337), tensor(1337), tensor(1337), tensor(1338), tensor(1338), tensor(1338), tensor(1338), tensor(
                    1338), tensor(1339), tensor(1339), tensor(1339), tensor(1339), tensor(1339), tensor(1339), tensor(
                    1339), tensor(1339), tensor(1340), tensor(1340), tensor(1340), tensor(1340), tensor(1340), tensor(
                    1341), tensor(1341), tensor(1341), tensor(1341), tensor(1341), tensor(1341), tensor(1341), tensor(
                    1341), tensor(1341), tensor(1341), tensor(1342), tensor(1342), tensor(1342), tensor(1342), tensor(
                    1342), tensor(1342), tensor(1342), tensor(1342), tensor(1342), tensor(1342), tensor(1343), tensor(
                    1343), tensor(1343), tensor(1343), tensor(1343), tensor(1343), tensor(1343), tensor(1343), tensor(
                    1343), tensor(1344), tensor(1344), tensor(1344), tensor(1344), tensor(1344), tensor(1344), tensor(
                    1344), tensor(1344), tensor(1344), tensor(1344), tensor(1344), tensor(1345), tensor(1345), tensor(
                    1345), tensor(1345), tensor(1345), tensor(1345), tensor(1345), tensor(1345), tensor(1345), tensor(
                    1345), tensor(1345), tensor(1345), tensor(1346), tensor(1346), tensor(1346), tensor(1346), tensor(
                    1346), tensor(1346), tensor(1346), tensor(1346), tensor(1346), tensor(1346), tensor(1346), tensor(
                    1346), tensor(1347), tensor(1347), tensor(1347), tensor(1347), tensor(1347), tensor(1347), tensor(
                    1347), tensor(1347), tensor(1347), tensor(1347), tensor(1348), tensor(1348), tensor(1348), tensor(
                    1348), tensor(1348), tensor(1348), tensor(1348), tensor(1348), tensor(1348), tensor(1348), tensor(
                    1349), tensor(1349), tensor(1349), tensor(1349), tensor(1349), tensor(1350), tensor(1350), tensor(
                    1350), tensor(1350), tensor(1350), tensor(1351), tensor(1351), tensor(1351), tensor(1351), tensor(
                    1394), tensor(1394), tensor(1394), tensor(1394), tensor(1394), tensor(1394), tensor(1394), tensor(
                    1395), tensor(1395), tensor(1395), tensor(1395), tensor(1396), tensor(1396), tensor(1396), tensor(
                    1396), tensor(1396), tensor(1396), tensor(1397), tensor(1397), tensor(1397), tensor(1397), tensor(
                    1397), tensor(1397), tensor(1397), tensor(1397), tensor(1398), tensor(1398), tensor(1398), tensor(
                    1398), tensor(1398), tensor(1398), tensor(1398), tensor(1399), tensor(1399), tensor(1399), tensor(
                    1399), tensor(1399), tensor(1399), tensor(1399), tensor(1399), tensor(1400), tensor(1401), tensor(
                    1402), tensor(1402), tensor(1403), tensor(1403), tensor(1403), tensor(1403), tensor(1403), tensor(
                    1404), tensor(1404), tensor(1404), tensor(1405), tensor(1405), tensor(1405), tensor(1406), tensor(
                    1406), tensor(1407), tensor(1407), tensor(1408), tensor(1408), tensor(1483), tensor(1483), tensor(
                    1484), tensor(1484), tensor(1485), tensor(1485), tensor(1486), tensor(1486), tensor(1487), tensor(
                    1487), tensor(1488), tensor(1489), tensor(1490), tensor(1490), tensor(1491), tensor(1491), tensor(
                    1492), tensor(1493), tensor(1494), tensor(1495), tensor(1495), tensor(1496), tensor(1496), tensor(
                    1497), tensor(1497), tensor(1577), tensor(1577), tensor(1577), tensor(1577), tensor(1577), tensor(
                    1577), tensor(1577), tensor(1577), tensor(1577), tensor(1577), tensor(1578), tensor(1578), tensor(
                    1578), tensor(1578), tensor(1578), tensor(1578), tensor(1578), tensor(1578), tensor(1578), tensor(
                    1578), tensor(1579), tensor(1579), tensor(1579), tensor(1579), tensor(1579), tensor(1579), tensor(
                    1579), tensor(1579), tensor(1580), tensor(1580), tensor(1580), tensor(1580), tensor(1580), tensor(
                    1580), tensor(1580), tensor(1580), tensor(1580), tensor(1580), tensor(1580), tensor(1580), tensor(
                    1581), tensor(1581), tensor(1581), tensor(1581), tensor(1581), tensor(1581), tensor(1581), tensor(
                    1581), tensor(1581), tensor(1582), tensor(1582), tensor(1582), tensor(1582), tensor(1582), tensor(
                    1582), tensor(1582), tensor(1582), tensor(1582), tensor(1582), tensor(1582), tensor(1583), tensor(
                    1583), tensor(1583), tensor(1583), tensor(1583), tensor(1583), tensor(1583), tensor(1583), tensor(
                    1583), tensor(1584), tensor(1584), tensor(1584), tensor(1584), tensor(1584), tensor(1584), tensor(
                    1584), tensor(1584), tensor(1584), tensor(1584), tensor(1584), tensor(1584), tensor(1585), tensor(
                    1585), tensor(1585), tensor(1585), tensor(1585), tensor(1585), tensor(1585), tensor(1585), tensor(
                    1586), tensor(1586), tensor(1586), tensor(1586), tensor(1586), tensor(1586), tensor(1586), tensor(
                    1586), tensor(1586), tensor(1587), tensor(1587), tensor(1587), tensor(1587), tensor(1587), tensor(
                    1587), tensor(1587), tensor(1587), tensor(1587), tensor(1587), tensor(1587), tensor(1588), tensor(
                    1588), tensor(1588), tensor(1588), tensor(1588), tensor(1588), tensor(1588), tensor(1588), tensor(
                    1588), tensor(1588), tensor(1588), tensor(1589), tensor(1589), tensor(1589), tensor(1589), tensor(
                    1589), tensor(1589), tensor(1589), tensor(1589), tensor(1589), tensor(1589), tensor(1590), tensor(
                    1590), tensor(1590), tensor(1590), tensor(1590), tensor(1590), tensor(1590), tensor(1590), tensor(
                    1590), tensor(1590), tensor(1621), tensor(1621), tensor(1621), tensor(1621), tensor(1621), tensor(
                    1621), tensor(1621), tensor(1621), tensor(1621), tensor(1621), tensor(1622), tensor(1622), tensor(
                    1622), tensor(1622), tensor(1622), tensor(1622), tensor(1622), tensor(1622), tensor(1622), tensor(
                    1623), tensor(1623), tensor(1623), tensor(1623), tensor(1623), tensor(1623), tensor(1623), tensor(
                    1623), tensor(1623), tensor(1624), tensor(1624), tensor(1624), tensor(1624), tensor(1624), tensor(
                    1624), tensor(1624), tensor(1624), tensor(1624), tensor(1624), tensor(1625), tensor(1625), tensor(
                    1625), tensor(1626), tensor(1626), tensor(1626), tensor(1626), tensor(1626), tensor(1626), tensor(
                    1626), tensor(1626), tensor(1627), tensor(1627), tensor(1627), tensor(1627), tensor(1627), tensor(
                    1627), tensor(1628), tensor(1628), tensor(1628), tensor(1628), tensor(1628), tensor(1628), tensor(
                    1629), tensor(1629), tensor(1629), tensor(1629), tensor(1629), tensor(1629), tensor(1629), tensor(
                    1629), tensor(1630), tensor(1630), tensor(1630), tensor(1630), tensor(1630), tensor(1630), tensor(
                    1630), tensor(1630), tensor(1630), tensor(1631), tensor(1631), tensor(1631), tensor(1631), tensor(
                    1631), tensor(1631), tensor(1631), tensor(1631), tensor(1631), tensor(1632), tensor(1632), tensor(
                    1632), tensor(1632), tensor(1632), tensor(1632), tensor(1632), tensor(1632), tensor(1633), tensor(
                    1633), tensor(1633), tensor(1633), tensor(1633), tensor(1633), tensor(1634), tensor(1634), tensor(
                    1634), tensor(1634), tensor(1635), tensor(1635), tensor(1635), tensor(1635), tensor(1635), tensor(
                    1636), tensor(1636), tensor(1636), tensor(1636), tensor(1636), tensor(1636), tensor(1636), tensor(
                    1637), tensor(1637), tensor(1637), tensor(1637), tensor(1637), tensor(1637), tensor(1637), tensor(
                    1637), tensor(1637), tensor(1637), tensor(1637), tensor(1638), tensor(1638), tensor(1638), tensor(
                    1638), tensor(1638), tensor(1638), tensor(1638), tensor(1638), tensor(1639), tensor(1639), tensor(
                    1639), tensor(1639), tensor(1639), tensor(1639), tensor(1639), tensor(1639), tensor(1639), tensor(
                    1640), tensor(1640), tensor(1640), tensor(1640), tensor(1640), tensor(1640), tensor(1640), tensor(
                    1640), tensor(1640), tensor(1640), tensor(1640), tensor(1641), tensor(1641), tensor(1641), tensor(
                    1641), tensor(1641), tensor(1641), tensor(1641), tensor(1641), tensor(1641), tensor(1642), tensor(
                    1642), tensor(1642), tensor(1642), tensor(1642), tensor(1642), tensor(1642), tensor(1643), tensor(
                    1643), tensor(1643), tensor(1643), tensor(1643), tensor(1643), tensor(1643), tensor(1643), tensor(
                    1644), tensor(1644), tensor(1644), tensor(1644), tensor(1644), tensor(1644), tensor(1645), tensor(
                    1645), tensor(1645), tensor(1645), tensor(1645), tensor(1645), tensor(1645), tensor(1645), tensor(
                    1645), tensor(1646), tensor(1646), tensor(1646), tensor(1646), tensor(1646), tensor(1646), tensor(
                    1646), tensor(1646), tensor(1646), tensor(1646), tensor(1646), tensor(1647), tensor(1647), tensor(
                    1647), tensor(1647), tensor(1647), tensor(1647), tensor(1647), tensor(1647), tensor(1647), tensor(
                    1647), tensor(1647), tensor(1647), tensor(1647), tensor(1648), tensor(1648), tensor(1648), tensor(
                    1648), tensor(1648), tensor(1648), tensor(1648), tensor(1649), tensor(1649), tensor(1649), tensor(
                    1649), tensor(1649), tensor(1649), tensor(1650), tensor(1650), tensor(1650), tensor(1650), tensor(
                    1650), tensor(1650), tensor(1650), tensor(1650), tensor(1680), tensor(1680), tensor(1680), tensor(
                    1680), tensor(1680), tensor(1680), tensor(1680), tensor(1680), tensor(1680), tensor(1680), tensor(
                    1680), tensor(1681), tensor(1681), tensor(1681), tensor(1681), tensor(1681), tensor(1681), tensor(
                    1681), tensor(1681), tensor(1681), tensor(1681), tensor(1682), tensor(1682), tensor(1682), tensor(
                    1682), tensor(1682), tensor(1682), tensor(1682), tensor(1682), tensor(1682), tensor(1682), tensor(
                    1682), tensor(1683), tensor(1683), tensor(1683), tensor(1683), tensor(1683), tensor(1683), tensor(
                    1683), tensor(1683), tensor(1683), tensor(1683), tensor(1683), tensor(1683), tensor(1683), tensor(
                    1684), tensor(1684), tensor(1684), tensor(1684), tensor(1684), tensor(1684), tensor(1684), tensor(
                    1684), tensor(1684), tensor(1684), tensor(1685), tensor(1685), tensor(1685), tensor(1685), tensor(
                    1685), tensor(1685), tensor(1685), tensor(1685), tensor(1685), tensor(1686), tensor(1686), tensor(
                    1686), tensor(1686), tensor(1686), tensor(1686), tensor(1686), tensor(1686), tensor(1686), tensor(
                    1686), tensor(1686), tensor(1686), tensor(1686), tensor(1687), tensor(1687), tensor(1687), tensor(
                    1687), tensor(1687), tensor(1687), tensor(1687), tensor(1687), tensor(1687), tensor(1687), tensor(
                    1687), tensor(1687), tensor(1687), tensor(1687), tensor(1688), tensor(1688), tensor(1688), tensor(
                    1688), tensor(1688), tensor(1688), tensor(1688), tensor(1688), tensor(1689), tensor(1689), tensor(
                    1689), tensor(1689), tensor(1689), tensor(1689), tensor(1689), tensor(1689), tensor(1690), tensor(
                    1690), tensor(1690), tensor(1690), tensor(1690), tensor(1690), tensor(1690), tensor(1691), tensor(
                    1691), tensor(1691), tensor(1691), tensor(1691), tensor(1691), tensor(1691), tensor(1691), tensor(
                    1691), tensor(1691), tensor(1691), tensor(1692), tensor(1692), tensor(1692), tensor(1692), tensor(
                    1692), tensor(1692), tensor(1692), tensor(1693), tensor(1693), tensor(1693), tensor(1693), tensor(
                    1693), tensor(1693), tensor(1693), tensor(1693), tensor(1693), tensor(1693), tensor(1693), tensor(
                    1693), tensor(1693), tensor(1734), tensor(1734), tensor(1734), tensor(1734), tensor(1734), tensor(
                    1734), tensor(1734), tensor(1734), tensor(1734), tensor(1734), tensor(1734), tensor(1734), tensor(
                    1734), tensor(1734), tensor(1735), tensor(1735), tensor(1735), tensor(1735), tensor(1735), tensor(
                    1735), tensor(1735), tensor(1735), tensor(1735), tensor(1735), tensor(1735), tensor(1735), tensor(
                    1735), tensor(1735), tensor(1735), tensor(1736), tensor(1736), tensor(1736), tensor(1736), tensor(
                    1736), tensor(1736), tensor(1736), tensor(1736), tensor(1736), tensor(1736), tensor(1736), tensor(
                    1736), tensor(1736), tensor(1737), tensor(1737), tensor(1737), tensor(1737), tensor(1737), tensor(
                    1737), tensor(1737), tensor(1737), tensor(1737), tensor(1737), tensor(1737), tensor(1737), tensor(
                    1737), tensor(1737), tensor(1737), tensor(1737), tensor(1737), tensor(1737), tensor(1737), tensor(
                    1737), tensor(1738), tensor(1738), tensor(1738), tensor(1738), tensor(1738), tensor(1738), tensor(
                    1738), tensor(1738), tensor(1738), tensor(1738), tensor(1738), tensor(1738), tensor(1738), tensor(
                    1738), tensor(1738), tensor(1738), tensor(1739), tensor(1739), tensor(1739), tensor(1739), tensor(
                    1739), tensor(1739), tensor(1739), tensor(1739), tensor(1739), tensor(1739), tensor(1739), tensor(
                    1739), tensor(1740), tensor(1740), tensor(1740), tensor(1740), tensor(1740), tensor(1740), tensor(
                    1740), tensor(1740), tensor(1740), tensor(1740), tensor(1740), tensor(1740), tensor(1740), tensor(
                    1740), tensor(1740), tensor(1740), tensor(1740), tensor(1740), tensor(1741), tensor(1741), tensor(
                    1741), tensor(1741), tensor(1741), tensor(1741), tensor(1741), tensor(1741), tensor(1741), tensor(
                    1741), tensor(1741), tensor(1741), tensor(1741), tensor(1741), tensor(1741), tensor(1741), tensor(
                    1741), tensor(1741), tensor(1741), tensor(1741), tensor(1741), tensor(1741), tensor(1742), tensor(
                    1742), tensor(1742), tensor(1742), tensor(1742), tensor(1742), tensor(1742), tensor(1742), tensor(
                    1742), tensor(1742), tensor(1742), tensor(1742), tensor(1742), tensor(1742), tensor(1742), tensor(
                    1742), tensor(1743), tensor(1743), tensor(1743), tensor(1743), tensor(1743), tensor(1743), tensor(
                    1743), tensor(1743), tensor(1744), tensor(1744), tensor(1744), tensor(1744), tensor(1744), tensor(
                    1744), tensor(1744), tensor(1744), tensor(1745), tensor(1745), tensor(1745), tensor(1745), tensor(
                    1745), tensor(1745), tensor(1745), tensor(1745), tensor(1745), tensor(1745), tensor(1745), tensor(
                    1745), tensor(1746), tensor(1746), tensor(1746), tensor(1746), tensor(1746), tensor(1746), tensor(
                    1746), tensor(1746), tensor(1746), tensor(1746), tensor(1746), tensor(1746), tensor(1747), tensor(
                    1747), tensor(1747), tensor(1747), tensor(1747), tensor(1747), tensor(1747), tensor(1747), tensor(
                    1747), tensor(1747), tensor(1747), tensor(1748), tensor(1748), tensor(1748), tensor(1748), tensor(
                    1748), tensor(1748), tensor(1748), tensor(1748), tensor(1748), tensor(1748), tensor(1748), tensor(
                    1801), tensor(1801), tensor(1801), tensor(1801), tensor(1802), tensor(1802), tensor(1802), tensor(
                    1803), tensor(1803), tensor(1803), tensor(1803), tensor(1804), tensor(1804), tensor(1804), tensor(
                    1804), tensor(1804), tensor(1804), tensor(1804), tensor(1804), tensor(1805), tensor(1805), tensor(
                    1805), tensor(1805), tensor(1805), tensor(1805), tensor(1805), tensor(1805), tensor(1805), tensor(
                    1806), tensor(1806), tensor(1806), tensor(1806), tensor(1806), tensor(1806), tensor(1806), tensor(
                    1807), tensor(1807), tensor(1807), tensor(1807), tensor(1807), tensor(1807), tensor(1807), tensor(
                    1808), tensor(1808), tensor(1808), tensor(1808), tensor(1808), tensor(1808), tensor(1808), tensor(
                    1809), tensor(1809), tensor(1809), tensor(1809), tensor(1809), tensor(1810), tensor(1810), tensor(
                    1810), tensor(1810), tensor(1810), tensor(1810), tensor(1810), tensor(1810), tensor(1810), tensor(
                    1811), tensor(1811), tensor(1811), tensor(1811), tensor(1811), tensor(1811), tensor(1811), tensor(
                    1811), tensor(1811), tensor(1811), tensor(1812), tensor(1812), tensor(1812), tensor(1812), tensor(
                    1812), tensor(1812), tensor(1812), tensor(1812), tensor(1812), tensor(1812), tensor(1812), tensor(
                    1812), tensor(1813), tensor(1813), tensor(1813), tensor(1813), tensor(1813), tensor(1813), tensor(
                    1813), tensor(1814), tensor(1814), tensor(1814), tensor(1814), tensor(1814), tensor(1814), tensor(
                    1815), tensor(1815), tensor(1815), tensor(1815), tensor(1815), tensor(1815), tensor(1815), tensor(
                    1815), tensor(2086), tensor(2086), tensor(2086), tensor(2086), tensor(2087), tensor(2087), tensor(
                    2087), tensor(2088), tensor(2088), tensor(2088), tensor(2089), tensor(2089), tensor(2090), tensor(
                    2090), tensor(2090), tensor(2090), tensor(2091), tensor(2091), tensor(2091), tensor(2091), tensor(
                    2092), tensor(2092), tensor(2092), tensor(2092), tensor(2092), tensor(2093), tensor(2093), tensor(
                    2093), tensor(2093), tensor(2094), tensor(2094), tensor(2094), tensor(2094), tensor(2095), tensor(
                    2095), tensor(2095), tensor(2095), tensor(2096), tensor(2096), tensor(2096), tensor(2096), tensor(
                    2097), tensor(2097), tensor(2097), tensor(2097), tensor(2098), tensor(2098), tensor(2098), tensor(
                    2099), tensor(2099), tensor(2099), tensor(2100), tensor(2100), tensor(2100), tensor(2100), tensor(
                    2142), tensor(2142), tensor(2142), tensor(2142), tensor(2143), tensor(2143), tensor(2143), tensor(
                    2143), tensor(2144), tensor(2144), tensor(2145), tensor(2145), tensor(2146), tensor(2146), tensor(
                    2147), tensor(2147), tensor(2148), tensor(2148), tensor(2149), tensor(2149), tensor(2150), tensor(
                    2150), tensor(2150), tensor(2151), tensor(2151), tensor(2151), tensor(2152), tensor(2152), tensor(
                    2152), tensor(2152), tensor(2153), tensor(2153), tensor(2153), tensor(2153), tensor(2153), tensor(
                    2154), tensor(2154), tensor(2154), tensor(2154), tensor(2159), tensor(2159), tensor(2159), tensor(
                    2159), tensor(2159), tensor(2159), tensor(2160), tensor(2160), tensor(2160), tensor(2160), tensor(
                    2160), tensor(2161), tensor(2161), tensor(2161), tensor(2161), tensor(2161), tensor(2162), tensor(
                    2162), tensor(2162), tensor(2163), tensor(2163), tensor(2163), tensor(2164), tensor(2164), tensor(
                    2164), tensor(2165), tensor(2165), tensor(2165), tensor(2166), tensor(2166), tensor(2166), tensor(
                    2166), tensor(2167), tensor(2167), tensor(2167), tensor(2167), tensor(2168), tensor(2168), tensor(
                    2168), tensor(2168), tensor(2168), tensor(2168), tensor(2169), tensor(2169), tensor(2169), tensor(
                    2169), tensor(2170), tensor(2170), tensor(2170), tensor(2170), tensor(2171), tensor(2171), tensor(
                    2171), tensor(2171), tensor(2172), tensor(2172), tensor(2172), tensor(2172), tensor(2173), tensor(
                    2173), tensor(2173), tensor(2183), tensor(2183), tensor(2183), tensor(2183), tensor(2183), tensor(
                    2184), tensor(2184), tensor(2185), tensor(2185), tensor(2185), tensor(2185), tensor(2186), tensor(
                    2186), tensor(2186), tensor(2186), tensor(2186), tensor(2187), tensor(2187), tensor(2187), tensor(
                    2188), tensor(2188), tensor(2188), tensor(2188), tensor(2188), tensor(2188), tensor(2188), tensor(
                    2188), tensor(2188), tensor(2189), tensor(2189), tensor(2189), tensor(2189), tensor(2189), tensor(
                    2189), tensor(2190), tensor(2190), tensor(2190), tensor(2190), tensor(2190), tensor(2190), tensor(
                    2190), tensor(2191), tensor(2191), tensor(2191), tensor(2191), tensor(2191), tensor(2192), tensor(
                    2192), tensor(2192), tensor(2192), tensor(2193), tensor(2193), tensor(2193), tensor(2220), tensor(
                    2220), tensor(2220), tensor(2221), tensor(2221), tensor(2221), tensor(2222), tensor(2222), tensor(
                    2223), tensor(2223), tensor(2224), tensor(2224), tensor(2225), tensor(2225), tensor(2225), tensor(
                    2226), tensor(2226), tensor(2226), tensor(2226), tensor(2227), tensor(2227), tensor(2227), tensor(
                    2227), tensor(2227), tensor(2227), tensor(2228), tensor(2228), tensor(2228), tensor(2228), tensor(
                    2228), tensor(2228), tensor(2229), tensor(2229), tensor(2229), tensor(2230), tensor(2230), tensor(
                    2230), tensor(2231), tensor(2231), tensor(2231), tensor(2231), tensor(2232), tensor(2232), tensor(
                    2232), tensor(2232), tensor(2232), tensor(2232), tensor(2232), tensor(2232), tensor(2232), tensor(
                    2232), tensor(2232), tensor(2233), tensor(2233), tensor(2233), tensor(2233), tensor(2233), tensor(
                    2233), tensor(2233), tensor(2233), tensor(2233), tensor(2234), tensor(2234), tensor(2234), tensor(
                    2234), tensor(2234), tensor(2234), tensor(2235), tensor(2235), tensor(2235), tensor(2236), tensor(
                    2236), tensor(2236), tensor(2236), tensor(2237), tensor(2237), tensor(2237), tensor(2399), tensor(
                    2399), tensor(2399), tensor(2399), tensor(2400), tensor(2400), tensor(2400), tensor(2400), tensor(
                    2401), tensor(2401), tensor(2401), tensor(2401), tensor(2402), tensor(2402), tensor(2402), tensor(
                    2402), tensor(2403), tensor(2403), tensor(2403), tensor(2403), tensor(2404), tensor(2404), tensor(
                    2404), tensor(2404), tensor(2405), tensor(2405), tensor(2405), tensor(2405), tensor(2406), tensor(
                    2406), tensor(2406), tensor(2406), tensor(2407), tensor(2407), tensor(2407), tensor(2407), tensor(
                    2408), tensor(2408), tensor(2408), tensor(2408), tensor(2409), tensor(2409), tensor(2409), tensor(
                    2409), tensor(2410), tensor(2410), tensor(2410), tensor(2410), tensor(2411), tensor(2411), tensor(
                    2411), tensor(2411), tensor(2412), tensor(2412), tensor(2412), tensor(2412), tensor(2413), tensor(
                    2413), tensor(2413), tensor(2413), tensor(2471), tensor(2472), tensor(2472), tensor(2473), tensor(
                    2473), tensor(2474), tensor(2474), tensor(2475), tensor(2475), tensor(2476), tensor(2476), tensor(
                    2477), tensor(2477), tensor(2478), tensor(2478), tensor(2479), tensor(2479), tensor(2480), tensor(
                    2480), tensor(2481), tensor(2482), tensor(2482), tensor(2483), tensor(2483), tensor(2484), tensor(
                    2484), tensor(2485), tensor(2485), tensor(2515), tensor(2515), tensor(2515), tensor(2515), tensor(
                    2516), tensor(2516), tensor(2517), tensor(2517), tensor(2518), tensor(2518), tensor(2519), tensor(
                    2519), tensor(2520), tensor(2520), tensor(2520), tensor(2520), tensor(2521), tensor(2521), tensor(
                    2521), tensor(2521), tensor(2522), tensor(2522), tensor(2522), tensor(2522), tensor(2523), tensor(
                    2523), tensor(2523), tensor(2523), tensor(2523), tensor(2523), tensor(2523), tensor(2524), tensor(
                    2524), tensor(2524), tensor(2524), tensor(2524), tensor(2524), tensor(2525), tensor(2525), tensor(
                    2525), tensor(2525), tensor(2525), tensor(2525), tensor(2526), tensor(2526), tensor(2526), tensor(
                    2527), tensor(2527), tensor(2527), tensor(2527), tensor(2527), tensor(2528), tensor(2528), tensor(
                    2528)]

        # rescoring and oks nms
        num_joints = self.num_joints
        in_vis_thre = self.in_vis_thre
        oks_thre = self.oks_thre
        oks_nmsed_kpts = []
        for img in kpts.keys():
            img_kpts = kpts[img]
            for n_p in img_kpts:
                box_score = n_p['score']
                kpt_score = 0
                valid_num = 0
                for n_jt in range(0, num_joints):
                    t_s = n_p['keypoints'][n_jt][2]
                    if t_s > in_vis_thre:
                        kpt_score = kpt_score + t_s
                        valid_num = valid_num + 1
                if valid_num != 0:
                    kpt_score = kpt_score / valid_num
                # rescoring
                n_p['score'] = kpt_score * box_score
                n_p['box_score'] = box_score
                n_p['keypoint_score'] = kpt_score

            # if self.soft_nms:
            #     keep = soft_oks_nms(
            #         [img_kpts[i] for i in range(len(img_kpts))],
            #         oks_thre
            #     )
            # else:
            #     keep = oks_nms(
            #         [img_kpts[i] for i in range(len(img_kpts))],
            #         oks_thre
            #     )
            #
            # if len(keep) == 0:
            #     oks_nmsed_kpts.append(img_kpts)
            # else:
            #     oks_nmsed_kpts.append([img_kpts[_keep] for _keep in keep])
            # person x (keypoints)
            # do not use nms, keep all detections
            keep = []
            if len(keep) == 0:
                oks_nmsed_kpts.append(img_kpts)
            else:
                oks_nmsed_kpts.append([img_kpts[_keep] for _keep in keep])

        # self._write_coco_keypoint_results(
        #     oks_nmsed_kpts, res_file)
        # print('self.image_set',self.image_set)#self.image_set test_LL-A
        # if 'test1' not in self.image_set:
        #     info_str = self._do_python_keypoint_eval(
        #         res_file, res_folder)
        #     name_value = OrderedDict(info_str)
        #     return name_value, name_value['AP']
        # else:
        #     return {'Null': 0}, 0
        # CrowdPose `test` set has annotation.
        self._write_coco_keypoint_results(
            oks_nmsed_kpts, res_file)
        info_str = self._do_python_keypoint_eval(
            res_file, res_folder
        )
        name_value = OrderedDict(info_str)
        return name_value, name_value['AP']

    # --------------------------------------------------------------------

    def _write_coco_keypoint_results(self, keypoints, res_file):
        data_pack = [
            {
                'cat_id': self._class_to_coco_ind[cls],
                'cls_ind': cls_ind,
                'cls': cls,
                'ann_type': 'keypoints',
                'keypoints': keypoints
            }
            for cls_ind, cls in enumerate(self.classes) if not cls == '__background__'
        ]

        results = self._coco_keypoint_results_one_category_kernel(data_pack[0])
        logger.info('=> Writing results json to %s' % res_file)
        with open(res_file, 'w') as f:
            json.dump(results, f, sort_keys=True, indent=4)
        try:
            json.load(open(res_file))
        except Exception:
            content = []
            with open(res_file, 'r') as f:
                for line in f:
                    content.append(line)
            content[-1] = ']'
            with open(res_file, 'w') as f:
                for c in content:
                    f.write(c)

    def _coco_keypoint_results_one_category_kernel(self, data_pack):
        cat_id = data_pack['cat_id']
        keypoints = data_pack['keypoints']
        cat_results = []
        num_joints = 14

        for img_kpts in keypoints:
            if len(img_kpts) == 0:
                continue

            _key_points = np.array(
                [img_kpts[k]['keypoints'] for k in range(len(img_kpts))]
            )
            key_points = np.zeros(
                (_key_points.shape[0], num_joints * 3),
                dtype=np.float
            )

            for ipt in range(num_joints):
                key_points[:, ipt * 3 + 0] = _key_points[:, ipt, 0]
                key_points[:, ipt * 3 + 1] = _key_points[:, ipt, 1]
                key_points[:, ipt * 3 + 2] = _key_points[:, ipt, 2]  # keypoints score.

            for k in range(len(img_kpts)):
                kpt = key_points[k].reshape((num_joints, 3))
                left_top = np.amin(kpt, axis=0)
                right_bottom = np.amax(kpt, axis=0)

                w = right_bottom[0] - left_top[0]
                h = right_bottom[1] - left_top[1]

                cat_results.append({
                    'image_id': img_kpts[k]['image_id'],
                    'category_id': cat_id,
                    'keypoints': list(key_points[k]),
                    'score': img_kpts[k]['score'],
                    'bbox': list([left_top[0], left_top[1], w, h])
                })

        return cat_results

    def _do_python_keypoint_eval(self, res_file, res_folder):
        coco_dt = self.coco.loadRes(res_file)
        coco_eval = COCOeval(self.coco, coco_dt, 'keypoints')
        coco_eval.params.useSegm = None
        coco_eval.evaluate()
        coco_eval.accumulate()
        coco_eval.summarize()
        stats_names = ['AP', 'Ap .5', 'AP .75', 'AR', 'AR .5', 'AR .75', 'AP (easy)', 'AP (medium)', 'AP (hard)']
        stats_index = [0, 1, 2, 5, 6, 7, 8, 9, 10]

        info_str = []
        for ind, name in enumerate(stats_names):
            info_str.append((name, coco_eval.stats[stats_index[ind]]))
            # info_str.append(coco_eval.stats[ind])

        return info_str

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值