From 68d9505ec5c2a37767df920cc94480f08d357a6b Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:20:16 +0000 Subject: [PATCH 01/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20SimpleHumanPose=5FID?= =?UTF-8?q?0956=5Ffor=5FACL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 1cddb2c9e24edf3b782d623b12d21a0e1c32dacf Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:33:04 +0000 Subject: [PATCH 02/59] add ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/LICENSE. --- .../cv/SimpleHumanPose_ID0956_for_ACL/LICENSE | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/LICENSE diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/LICENSE b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/LICENSE new file mode 100644 index 000000000..7208551df --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE \ No newline at end of file -- Gitee From 30e17b2266f6caf80ff24117c10513dc924a8c2f Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:33:28 +0000 Subject: [PATCH 03/59] add ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/requirements.txt. --- .../requirements.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/requirements.txt diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/requirements.txt b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/requirements.txt new file mode 100644 index 000000000..1d32e97b3 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/requirements.txt @@ -0,0 +1,19 @@ +termcolor>=1.1 +tabulate>=0.7.7 +tqdm>4.11.1 +pyarrow>=0.9.0 +pyzmq>=16 + +msgpack +msgpack_numpy +datetime +setproctitle +pillow +matplotlib + +Cython>=0.19.2 +numpy>=1.7.1 +scipy>=0.13.2 +opencv-python + +pycocotools \ No newline at end of file -- Gitee From 108bf3f7efc1dd93ee89a229b652c203632d0239 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:34:45 +0000 Subject: [PATCH 04/59] add ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/author.txt. --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/author.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/author.txt diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/author.txt b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/author.txt new file mode 100644 index 000000000..20dd1837b --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/author.txt @@ -0,0 +1,4 @@ +Fang Wang, Lei Xie +Nanjing University +Nanjing, Jiangsu, China +mf20330077@smail.nju.edu.cn, lxie@nju.edu.cn \ No newline at end of file -- Gitee From 8dcb95409e07c745a6ed624a1562de07915f064f Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:35:23 +0000 Subject: [PATCH 05/59] add ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/modelzoo_level.txt. --- .../cv/SimpleHumanPose_ID0956_for_ACL/modelzoo_level.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/modelzoo_level.txt diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/modelzoo_level.txt b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/modelzoo_level.txt new file mode 100644 index 000000000..62ed12347 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/modelzoo_level.txt @@ -0,0 +1,6 @@ +ModelConvert:OK +QuantStatus:OK +FuncStatus:OK +PrecisionStatus:OK +AutoTune:OK +PerfStatus:OK \ No newline at end of file -- Gitee From 6183bf1f6187c2888fcec41ab311fef365cff06a Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:36:24 +0000 Subject: [PATCH 06/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20src?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 65e935a00cad9f2c5e5f019d99505f139ec00ecb Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:38:23 +0000 Subject: [PATCH 07/59] add ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/pip-requirements.txt. --- .../src/pip-requirements.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/pip-requirements.txt diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/pip-requirements.txt b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/pip-requirements.txt new file mode 100644 index 000000000..1d32e97b3 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/pip-requirements.txt @@ -0,0 +1,19 @@ +termcolor>=1.1 +tabulate>=0.7.7 +tqdm>4.11.1 +pyarrow>=0.9.0 +pyzmq>=16 + +msgpack +msgpack_numpy +datetime +setproctitle +pillow +matplotlib + +Cython>=0.19.2 +numpy>=1.7.1 +scipy>=0.13.2 +opencv-python + +pycocotools \ No newline at end of file -- Gitee From 1eae63fdc79449bcd4e27f953a1cc08b3fd9cd62 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:38:57 +0000 Subject: [PATCH 08/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20assets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 52fb33f6f0ddd268cc06deecd372a453b049d519 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:40:50 +0000 Subject: [PATCH 09/59] first commit --- .../src/assets/1.jpg | Bin 0 -> 117209 bytes .../src/assets/2.jpg | Bin 0 -> 223163 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/1.jpg create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/2.jpg diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/1.jpg b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..97087f6547db2111f5a55a6fabebe2752a5c58bb GIT binary patch literal 117209 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%0DtrIO>!O`{oN0Vlt?{SVYvK;9Oxv38SQIlv(h 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

~bCZmne?q<~|RRN$XRQV77oVe;3hf5AJx3~8UV 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

>x7?gy(9#i-$*Jau_Z3UushOJj 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 ItN(u!05d{CO#lD@ literal 0 HcmV?d00001 diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/2.jpg b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..628c9fac1ba6cfe509141c7b83f6845a977da2ff GIT binary patch literal 223163 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 literal 0 HcmV?d00001 -- Gitee From 07de1a2282c03b61f215b6bced77abb392517b11 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:41:00 +0000 Subject: [PATCH 10/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/assets/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From e883f68337b65c05c51c5c09276740b3303bd917 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:42:56 +0000 Subject: [PATCH 11/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 3e4c50b8ac2acdb52c104c4818dc238a7edbb9a4 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:43:33 +0000 Subject: [PATCH 12/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20COCO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From fa2095837127c10bf7e8869561fe429ea7e1ab43 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:43:46 +0000 Subject: [PATCH 13/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/data/COCO/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 67eea6dd8bac9e3b34215e12ecbd15722016b7ab Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:44:37 +0000 Subject: [PATCH 14/59] first commit --- .../src/data/dataset.py | 197 ++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/dataset.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/dataset.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/dataset.py new file mode 100644 index 000000000..4b78780ca --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/dataset.py @@ -0,0 +1,197 @@ +#!/usr/bin/python3 +# coding=utf-8 + +from npu_bridge.npu_init import * +import os +import os.path as osp +import numpy as np +import cv2 +import json +import pickle +import matplotlib.pyplot as plt +import tensorflow as tf + +import sys + +current_path = os.path.dirname(os.path.realpath(__file__)) # 对应于COCO +project_root = os.path.dirname(os.path.dirname(current_path)) # 对应于TF-Simple +main_path = os.path.join(project_root, "main", "train.py") +print("main_path:", main_path) + + +cur_dir = os.path.dirname(__file__) +# print("========>>>>>>cur_dir:{}".format(cur_dir)) +sys.path.insert(0, osp.join(cur_dir, 'PythonAPI')) +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval + + +class Dataset(object): + dataset_name = 'COCO' + num_kps = 17 + kps_names = ['nose', 'l_eye', 'r_eye', 'l_ear', 'r_ear', 'l_shoulder', + 'r_shoulder', 'l_elbow', 'r_elbow', 'l_wrist', 'r_wrist', + 'l_hip', 'r_hip', 'l_knee', 'r_knee', 'l_ankle', 'r_ankle'] + kps_symmetry = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (15, 16)] + kps_lines = [(1, 2), (0, 1), (0, 2), (2, 4), (1, 3), (6, 8), (8, 10), (5, 7), (7, 9), (12, 14), (14, 16), (11, 13), + (13, 15), (5, 6), (11, 12)] + + # human_det_path = osp.join('..', 'data', dataset_name, 'dets', 'human_detection.json') # human detection result + # img_path = osp.join('..', 'data', dataset_name, 'images') + # train_annot_path = osp.join('..', 'data', dataset_name, 'annotations', 'person_keypoints_train2017.json') + # train_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_train2017.json') + # val_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_val2017.json') + # test_annot_path = osp.join(cur_dir, 'data', dataset_name, 'annotations', 'image_info_test-dev2017.json') + + # tf_flags = tf.app.flags.FLAGS + data_path = "cache/dataset" + img_path = osp.join(data_path, 'images') + human_det_path = osp.join(data_path, 'dets', 'human_detection.json') + train_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_train2017.json') + val_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_val2017.json') + test_annot_path = osp.join(data_path, 'annotations', 'image_info_test-dev2017.json') + + def load_train_data(self, score=False): + coco = COCO(self.train_annot_path) + train_data = [] + for aid in coco.anns.keys(): + ann = coco.anns[aid] + imgname = 'train2017/' + coco.imgs[ann['image_id']]['file_name'] + joints = ann['keypoints'] + + if (ann['image_id'] not in coco.imgs) or ann['iscrowd'] or (np.sum(joints[2::3]) == 0) or ( + ann['num_keypoints'] == 0): + continue + + # sanitize bboxes + x, y, w, h = ann['bbox'] + img = coco.loadImgs(ann['image_id'])[0] + width, height = img['width'], img['height'] + 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 ann['area'] > 0 and x2 >= x1 and y2 >= y1: + bbox = [x1, y1, x2 - x1, y2 - y1] + else: + continue + + if score: + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) + else: + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints) + + train_data.append(data) + + return train_data + + def load_val_data_with_annot(self): + coco = COCO(self.val_annot_path) + val_data = [] + for aid in coco.anns.keys(): + ann = coco.anns[aid] + if ann['image_id'] not in coco.imgs: + continue + imgname = 'val2017/' + coco.imgs[ann['image_id']]['file_name'] + bbox = ann['bbox'] + joints = ann['keypoints'] + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) + val_data.append(data) + + return val_data + + def load_annot(self, db_set): + if db_set == 'train': + coco = COCO(self.train_annot_path) + elif db_set == 'val': + coco = COCO(self.val_annot_path) + elif db_set == 'test': + coco = COCO(self.test_annot_path) + else: + print('Unknown db_set') + assert 0 + + return coco + + def load_imgid(self, annot): + return annot.imgs + + def imgid_to_imgname(self, annot, imgid, db_set): + imgs = annot.loadImgs(imgid) + imgname = [db_set + '2017/' + i['file_name'] for i in imgs] + return imgname + + def evaluation(self, result, gt, result_dir, db_set): + result_path = osp.join(result_dir, 'result.json') + with open(result_path, 'w') as f: + json.dump(result, f) # 把result中的东西写到result.json里面 + + result = gt.loadRes(result_path) + cocoEval = COCOeval(gt, result, iouType='keypoints') + + cocoEval.evaluate() + cocoEval.accumulate() + cocoEval.summarize() + + result_path = osp.join(result_dir, 'result.pkl') + with open(result_path, 'wb') as f: + pickle.dump(cocoEval, f, 2) + print("Saved result file to " + result_path) + + def vis_keypoints(self, img, kps, kp_thresh=0.4, alpha=1): + + # Convert from plt 0-1 RGBA colors to 0-255 BGR colors for opencv. + cmap = plt.get_cmap('rainbow') + colors = [cmap(i) for i in np.linspace(0, 1, len(self.kps_lines) + 2)] + colors = [(c[2] * 255, c[1] * 255, c[0] * 255) for c in colors] + + # Perform the drawing on a copy of the image, to allow for blending. + kp_mask = np.copy(img) + + # Draw mid shoulder / mid hip first for better visualization. + mid_shoulder = ( + kps[:2, 5] + + kps[:2, 6]) / 2.0 + sc_mid_shoulder = np.minimum( + kps[2, 5], + kps[2, 6]) + mid_hip = ( + kps[:2, 11] + + kps[:2, 12]) / 2.0 + sc_mid_hip = np.minimum( + kps[2, 11], + kps[2, 12]) + nose_idx = 0 + if sc_mid_shoulder > kp_thresh and kps[2, nose_idx] > kp_thresh: + cv2.line( + kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(kps[:2, nose_idx].astype(np.int32)), + color=colors[len(self.kps_lines)], thickness=2, lineType=cv2.LINE_AA) + if sc_mid_shoulder > kp_thresh and sc_mid_hip > kp_thresh: + cv2.line( + kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(mid_hip.astype(np.int32)), + color=colors[len(self.kps_lines) + 1], thickness=2, lineType=cv2.LINE_AA) + + # Draw the keypoints. + for l in range(len(self.kps_lines)): + i1 = self.kps_lines[l][0] + i2 = self.kps_lines[l][1] + p1 = kps[0, i1].astype(np.int32), kps[1, i1].astype(np.int32) + p2 = kps[0, i2].astype(np.int32), kps[1, i2].astype(np.int32) + if kps[2, i1] > kp_thresh and kps[2, i2] > kp_thresh: + cv2.line( + kp_mask, p1, p2, + color=colors[l], thickness=2, lineType=cv2.LINE_AA) + if kps[2, i1] > kp_thresh: + cv2.circle( + kp_mask, p1, + radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) + if kps[2, i2] > kp_thresh: + cv2.circle( + kp_mask, p2, + radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) + + # Blend the keypoints. + return cv2.addWeighted(img, 1.0 - alpha, kp_mask, alpha, 0) + + +dbcfg = Dataset() -- Gitee From cba991b031d482e416bef88a0c6c2082166f1d7c Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:45:32 +0000 Subject: [PATCH 15/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20lib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 29da46ef6fe82d84ee20309f36e7ceb492d9d3d6 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:45:59 +0000 Subject: [PATCH 16/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20nets?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 55d37bc1609ce036e080bf1310adcb061ffdad19 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:46:08 +0000 Subject: [PATCH 17/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20nms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 5920b2863407f785ed52ba6d6e0dc018c2074762 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:46:21 +0000 Subject: [PATCH 18/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20tfflat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 711f3eec9eae43402b517404978d15d2fea2e29d Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:46:32 +0000 Subject: [PATCH 19/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20utils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 1016183c9ccdcfe7a2a74f5d9cf71928a6df390c Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:46:56 +0000 Subject: [PATCH 20/59] first commit --- .../cv/SimpleHumanPose_ID0956_for_ACL/src/lib/Makefile | 4 ++++ .../cv/SimpleHumanPose_ID0956_for_ACL/src/lib/__init__.py | 3 +++ 2 files changed, 7 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/Makefile create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/__init__.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/Makefile b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/Makefile new file mode 100644 index 000000000..57d580440 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/Makefile @@ -0,0 +1,4 @@ +all: + cd nms; python setup.py build_ext --inplace; rm -rf build; cd ../../ +clean: + cd nms; rm *.so; cd ../../ diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/__init__.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/__init__.py new file mode 100644 index 000000000..faaaf799c --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + + -- Gitee From 459b3e92d8bcc65575841e49f416328a081bce73 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:47:22 +0000 Subject: [PATCH 21/59] first commit --- .../src/lib/nets/__init__.py | 0 .../src/lib/nets/basemodel.py | 179 ++++++++++ .../src/lib/nets/resnet_utils.py | 290 +++++++++++++++ .../src/lib/nets/resnet_v1.py | 333 ++++++++++++++++++ 4 files changed, 802 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/__init__.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/basemodel.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/resnet_utils.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/resnet_v1.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/__init__.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/basemodel.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/basemodel.py new file mode 100644 index 000000000..475da8674 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/basemodel.py @@ -0,0 +1,179 @@ +from npu_bridge.npu_init import * +import tensorflow as tf +import tensorflow.contrib.slim as slim +from . import resnet_v1, resnet_utils +from tensorflow.contrib.slim import arg_scope +from tensorflow.python.framework import ops +from tensorflow.python.ops import nn_ops +from tensorflow.contrib.layers.python.layers import regularizers, \ + initializers, layers +from config import cfg +import numpy as np + +def resnet_arg_scope(bn_is_training, + bn_trainable, + trainable=True, + weight_decay=cfg.weight_decay, + weight_init = initializers.variance_scaling_initializer(), + batch_norm_decay=0.99, + batch_norm_epsilon=1e-9, + batch_norm_scale=True): + batch_norm_params = { + 'is_training': bn_is_training, + 'decay': batch_norm_decay, + 'epsilon': batch_norm_epsilon, + 'scale': batch_norm_scale, + 'trainable': bn_trainable, + 'updates_collections': ops.GraphKeys.UPDATE_OPS + } + + with arg_scope( + [slim.conv2d, slim.conv2d_transpose], + weights_regularizer=regularizers.l2_regularizer(weight_decay), + weights_initializer=weight_init, + trainable=trainable, + activation_fn=nn_ops.relu, + normalizer_fn=layers.batch_norm, + normalizer_params=batch_norm_params): + with arg_scope([layers.batch_norm], **batch_norm_params) as arg_sc: + return arg_sc + +def resnet50(inp, bn_is_training, bn_trainable): + bottleneck = resnet_v1.bottleneck + blocks = [ + resnet_utils.Block('block1', bottleneck, + [(256, 64, 1)] * 2 + [(256, 64, 1)]), + resnet_utils.Block('block2', bottleneck, + [(512, 128, 2)] + [(512, 128, 1)] * 3), + resnet_utils.Block('block3', bottleneck, + [(1024, 256, 2)] + [(1024, 256, 1)] * 5), + resnet_utils.Block('block4', bottleneck, + [(2048, 512, 2)] + [(2048, 512, 1)] * 2) + ] + + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + + with tf.variable_scope('resnet_v1_50', 'resnet_v1_50'): + + net = resnet_utils.conv2d_same( + tf.concat(inp,axis=3), 64, 7, stride=2, scope='conv1') + + net = tf.pad(net, [[0, 0], [1, 1], [1, 1], [0, 0]]) + net = slim.max_pool2d( + net, [3, 3], stride=2, padding='VALID', scope='pool1') + net, _ = resnet_v1.resnet_v1( # trainable ????? + net, blocks[0:1], + global_pool=False, include_root_block=False, + scope='resnet_v1_50') + + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + net2, _ = resnet_v1.resnet_v1( + net, blocks[1:2], + global_pool=False, include_root_block=False, + scope='resnet_v1_50') + + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + net3, _ = resnet_v1.resnet_v1( + net2, blocks[2:3], + global_pool=False, include_root_block=False, + scope='resnet_v1_50') + + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + net4, _ = resnet_v1.resnet_v1( + net3, blocks[3:4], + global_pool=False, include_root_block=False, + scope='resnet_v1_50') + + resnet_features = [net, net2, net3, net4] + return resnet_features + +def resnet101(inp, bn_is_training, bn_trainable): + bottleneck = resnet_v1.bottleneck + blocks = [ + resnet_utils.Block('block1', bottleneck, + [(256, 64, 1)] * 2 + [(256, 64, 1)]), + resnet_utils.Block('block2', bottleneck, + [(512, 128, 2)] + [(512, 128, 1)] * 3), + resnet_utils.Block('block3', bottleneck, + [(1024, 256, 2)] + [(1024, 256, 1)] * 22), + resnet_utils.Block('block4', bottleneck, + [(2048, 512, 2)] + [(2048, 512, 1)] * 2) + ] + + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + with tf.variable_scope('resnet_v1_101', 'resnet_v1_101'): + + net = resnet_utils.conv2d_same( + tf.concat(inp,axis=3), 64, 7, stride=2, scope='conv1') + net = tf.pad(net, [[0, 0], [1, 1], [1, 1], [0, 0]]) + net = slim.max_pool2d( + net, [3, 3], stride=2, padding='VALID', scope='pool1') + net, _ = resnet_v1.resnet_v1( # trainable ????? + net, blocks[0:1], + global_pool=False, include_root_block=False, + scope='resnet_v1_101') + + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + net2, _ = resnet_v1.resnet_v1( + net, blocks[1:2], + global_pool=False, include_root_block=False, + scope='resnet_v1_101') + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + net3, _ = resnet_v1.resnet_v1( + net2, blocks[2:3], + global_pool=False, include_root_block=False, + scope='resnet_v1_101') + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + net4, _ = resnet_v1.resnet_v1( + net3, blocks[3:4], + global_pool=False, include_root_block=False, + scope='resnet_v1_101') + + resnet_features = [net, net2, net3, net4] + return resnet_features + +def resnet152(inp, bn_is_training, bn_trainable): + bottleneck = resnet_v1.bottleneck + blocks = [ + resnet_utils.Block('block1', bottleneck, + [(256, 64, 1)] * 2 + [(256, 64, 1)]), + resnet_utils.Block('block2', bottleneck, + [(512, 128, 2)] + [(512, 128, 1)] * 7), + resnet_utils.Block('block3', bottleneck, + [(1024, 256, 2)] + [(1024, 256, 1)] * 35), + resnet_utils.Block('block4', bottleneck, + [(2048, 512, 2)] + [(2048, 512, 1)] * 2) + ] + + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + with tf.variable_scope('resnet_v1_152', 'resnet_v1_152'): + net = resnet_utils.conv2d_same( + tf.concat(inp,axis=3), 64, 7, stride=2, scope='conv1') + net = tf.pad(net, [[0, 0], [1, 1], [1, 1], [0, 0]]) + net = slim.max_pool2d( + net, [3, 3], stride=2, padding='VALID', scope='pool1') + net, _ = resnet_v1.resnet_v1( # trainable ????? + net, blocks[0:1], + global_pool=False, include_root_block=False, + scope='resnet_v1_152') + + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + net2, _ = resnet_v1.resnet_v1( + net, blocks[1:2], + global_pool=False, include_root_block=False, + scope='resnet_v1_152') + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + net3, _ = resnet_v1.resnet_v1( + net2, blocks[2:3], + global_pool=False, include_root_block=False, + scope='resnet_v1_152') + with slim.arg_scope(resnet_arg_scope(bn_is_training=bn_is_training, bn_trainable=bn_trainable)): + net4, _ = resnet_v1.resnet_v1( + net3, blocks[3:4], + global_pool=False, include_root_block=False, + scope='resnet_v1_152') + + resnet_features = [net, net2, net3, net4] + return resnet_features + + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/resnet_utils.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/resnet_utils.py new file mode 100644 index 000000000..b1783a2ff --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/resnet_utils.py @@ -0,0 +1,290 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains building blocks for various versions of Residual Networks. + +Residual networks (ResNets) were proposed in: + Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Deep Residual Learning for Image Recognition. arXiv:1512.03385, 2015 + +More variants were introduced in: + Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Identity Mappings in Deep Residual Networks. arXiv: 1603.05027, 2016 + +We can obtain different ResNet variants by changing the network depth, width, +and form of residual unit. This module implements the infrastructure for +building them. Concrete ResNet units and full ResNet networks are implemented in +the accompanying resnet_v1.py and resnet_v2.py modules. + +Compared to https://github.com/KaimingHe/deep-residual-networks, in the current +implementation we subsample the output activations in the last residual unit of +each block, instead of subsampling the input activations in the first residual +unit of each block. The two implementations give identical results but our +implementation is more memory efficient. +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from npu_bridge.npu_init import * + +import collections + +from tensorflow.contrib import layers as layers_lib +from tensorflow.contrib.framework.python.ops import add_arg_scope +from tensorflow.contrib.framework.python.ops import arg_scope +from tensorflow.contrib.layers.python.layers import initializers +from tensorflow.contrib.layers.python.layers import layers +from tensorflow.contrib.layers.python.layers import regularizers +from tensorflow.contrib.layers.python.layers import utils +from tensorflow.python.framework import ops +from tensorflow.python.ops import array_ops +from tensorflow.python.ops import nn_ops +from tensorflow.python.ops import variable_scope + + +class Block(collections.namedtuple('Block', ['scope', 'unit_fn', 'args'])): + """A named tuple describing a ResNet block. + + Its parts are: + scope: The scope of the `Block`. + unit_fn: The ResNet unit function which takes as input a `Tensor` and + returns another `Tensor` with the output of the ResNet unit. + args: A list of length equal to the number of units in the `Block`. The list + contains one (depth, depth_bottleneck, stride) tuple for each unit in the + block to serve as argument to unit_fn. + """ + + +def subsample(inputs, factor, scope=None): + """Subsamples the input along the spatial dimensions. + + Args: + inputs: A `Tensor` of size [batch, height_in, width_in, channels]. + factor: The subsampling factor. + scope: Optional variable_scope. + + Returns: + output: A `Tensor` of size [batch, height_out, width_out, channels] with the + input, either intact (if factor == 1) or subsampled (if factor > 1). + """ + if factor == 1: + return inputs + else: + return layers.max_pool2d(inputs, [1, 1], stride=factor, scope=scope) + + +def conv2d_same(inputs, num_outputs, kernel_size, stride, w_init=initializers.variance_scaling_initializer(), rate=1, scope=None): + """Strided 2-D convolution with 'SAME' padding. + + When stride > 1, then we do explicit zero-padding, followed by conv2d with + 'VALID' padding. + + Note that + + net = conv2d_same(inputs, num_outputs, 3, stride=stride) + + is equivalent to + + net = tf.contrib.layers.conv2d(inputs, num_outputs, 3, stride=1, + padding='SAME') + net = subsample(net, factor=stride) + + whereas + + net = tf.contrib.layers.conv2d(inputs, num_outputs, 3, stride=stride, + padding='SAME') + + is different when the input's height or width is even, which is why we add the + current function. For more details, see ResnetUtilsTest.testConv2DSameEven(). + + Args: + inputs: A 4-D tensor of size [batch, height_in, width_in, channels]. + num_outputs: An integer, the number of output filters. + kernel_size: An int with the kernel_size of the filters. + stride: An integer, the output stride. + rate: An integer, rate for atrous convolution. + scope: Scope. + + Returns: + output: A 4-D tensor of size [batch, height_out, width_out, channels] with + the convolution output. + """ + if stride == 1: + return layers_lib.conv2d( + inputs, + num_outputs, + kernel_size, + stride=1, + rate=rate, + padding='SAME', + weights_initializer=w_init, + scope=scope) + else: + kernel_size_effective = kernel_size + (kernel_size - 1) * (rate - 1) + pad_total = kernel_size_effective - 1 + pad_beg = pad_total // 2 + pad_end = pad_total - pad_beg + inputs = array_ops.pad( + inputs, [[0, 0], [pad_beg, pad_end], [pad_beg, pad_end], [0, 0]]) + return layers_lib.conv2d( + inputs, + num_outputs, + kernel_size, + stride=stride, + rate=rate, + padding='VALID', + weights_initializer=w_init, + scope=scope) + + +@add_arg_scope +def stack_blocks_dense(net, + blocks, + output_stride=None, + outputs_collections=None): + """Stacks ResNet `Blocks` and controls output feature density. + + First, this function creates scopes for the ResNet in the form of + 'block_name/unit_1', 'block_name/unit_2', etc. + + Second, this function allows the user to explicitly control the ResNet + output_stride, which is the ratio of the input to output spatial resolution. + This is useful for dense prediction tasks such as semantic segmentation or + object detection. + + Most ResNets consist of 4 ResNet blocks and subsample the activations by a + factor of 2 when transitioning between consecutive ResNet blocks. This results + to a nominal ResNet output_stride equal to 8. If we set the output_stride to + half the nominal network stride (e.g., output_stride=4), then we compute + responses twice. + + Control of the output feature density is implemented by atrous convolution. + + Args: + net: A `Tensor` of size [batch, height, width, channels]. + blocks: A list of length equal to the number of ResNet `Blocks`. Each + element is a ResNet `Block` object describing the units in the `Block`. + output_stride: If `None`, then the output will be computed at the nominal + network stride. If output_stride is not `None`, it specifies the requested + ratio of input to output spatial resolution, which needs to be equal to + the product of unit strides from the start up to some level of the ResNet. + For example, if the ResNet employs units with strides 1, 2, 1, 3, 4, 1, + then valid values for the output_stride are 1, 2, 6, 24 or None (which + is equivalent to output_stride=24). + outputs_collections: Collection to add the ResNet block outputs. + + Returns: + net: Output tensor with stride equal to the specified output_stride. + + Raises: + ValueError: If the target output_stride is not valid. + """ + # The current_stride variable keeps track of the effective stride of the + # activations. This allows us to invoke atrous convolution whenever applying + # the next residual unit would result in the activations having stride larger + # than the target output_stride. + current_stride = 1 + + # The atrous convolution rate parameter. + rate = 1 + + for block in blocks: + with variable_scope.variable_scope(block.scope, 'block', [net]) as sc: + for i, unit in enumerate(block.args): + if output_stride is not None and current_stride > output_stride: + raise ValueError('The target output_stride cannot be reached.') + + with variable_scope.variable_scope('unit_%d' % (i + 1), values=[net]): + unit_depth, unit_depth_bottleneck, unit_stride = unit + + # If we have reached the target output_stride, then we need to employ + # atrous convolution with stride=1 and multiply the atrous rate by the + # current unit's stride for use in subsequent layers. + if output_stride is not None and current_stride == output_stride: + net = block.unit_fn( + net, + depth=unit_depth, + depth_bottleneck=unit_depth_bottleneck, + stride=1, + rate=rate) + rate *= unit_stride + + else: + net = block.unit_fn( + net, + depth=unit_depth, + depth_bottleneck=unit_depth_bottleneck, + stride=unit_stride, + rate=1) + current_stride *= unit_stride + net = utils.collect_named_outputs(outputs_collections, sc.name, net) + + if output_stride is not None and current_stride != output_stride: + raise ValueError('The target output_stride cannot be reached.') + + return net + + +def resnet_arg_scope(is_training=True, + weight_decay=0.0001, + batch_norm_decay=0.997, + batch_norm_epsilon=1e-5, + batch_norm_scale=True): + """Defines the default ResNet arg scope. + + TODO(gpapan): The batch-normalization related default values above are + appropriate for use in conjunction with the reference ResNet models + released at https://github.com/KaimingHe/deep-residual-networks. When + training ResNets from scratch, they might need to be tuned. + + Args: + is_training: Whether or not we are training the parameters in the batch + normalization layers of the model. + weight_decay: The weight decay to use for regularizing the model. + batch_norm_decay: The moving average decay when estimating layer activation + statistics in batch normalization. + batch_norm_epsilon: Small constant to prevent division by zero when + normalizing activations by their variance in batch normalization. + batch_norm_scale: If True, uses an explicit `gamma` multiplier to scale the + activations in the batch normalization layer. + + Returns: + An `arg_scope` to use for the resnet models. + """ + batch_norm_params = { + 'is_training': is_training, + 'decay': batch_norm_decay, + 'epsilon': batch_norm_epsilon, + 'scale': batch_norm_scale, + 'updates_collections': ops.GraphKeys.UPDATE_OPS, + } + + with arg_scope( + [layers_lib.conv2d], + weights_regularizer=regularizers.l2_regularizer(weight_decay), + weights_initializer=initializers.variance_scaling_initializer(), + activation_fn=nn_ops.relu, + normalizer_fn=layers.batch_norm, + normalizer_params=batch_norm_params): + with arg_scope([layers.batch_norm], **batch_norm_params): + # The following implies padding='SAME' for pool1, which makes feature + # alignment easier for dense prediction tasks. This is also used in + # https://github.com/facebook/fb.resnet.torch. However the accompanying + # code of 'Deep Residual Learning for Image Recognition' uses + # padding='VALID' for pool1. You can switch to that choice by setting + # tf.contrib.framework.arg_scope([tf.contrib.layers.max_pool2d], padding='VALID'). + with arg_scope([layers.max_pool2d], padding='SAME') as arg_sc: + return arg_sc + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/resnet_v1.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/resnet_v1.py new file mode 100644 index 000000000..de5eb991f --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nets/resnet_v1.py @@ -0,0 +1,333 @@ +# Copyright 2016 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Contains definitions for the original form of Residual Networks. + +The 'v1' residual networks (ResNets) implemented in this module were proposed +by: +[1] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Deep Residual Learning for Image Recognition. arXiv:1512.03385 + +Other variants were introduced in: +[2] Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun + Identity Mappings in Deep Residual Networks. arXiv: 1603.05027 + +The networks defined in this module utilize the bottleneck building block of +[1] with projection shortcuts only for increasing depths. They employ batch +normalization *after* every weight layer. This is the architecture used by +MSRA in the Imagenet and MSCOCO 2016 competition models ResNet-101 and +ResNet-152. See [2; Fig. 1a] for a comparison between the current 'v1' +architecture and the alternative 'v2' architecture of [2] which uses batch +normalization *before* every weight layer in the so-called full pre-activation +units. + +Typical use: + + from tensorflow.contrib.slim.python.slim.nets import + resnet_v1 + +ResNet-101 for image classification into 1000 classes: + + # inputs has shape [batch, 224, 224, 3] + with slim.arg_scope(resnet_v1.resnet_arg_scope(is_training)): + net, end_points = resnet_v1.resnet_v1_101(inputs, 1000) + +ResNet-101 for semantic segmentation into 21 classes: + + # inputs has shape [batch, 513, 513, 3] + with slim.arg_scope(resnet_v1.resnet_arg_scope(is_training)): + net, end_points = resnet_v1.resnet_v1_101(inputs, + 21, + global_pool=False, + output_stride=16) +""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from npu_bridge.npu_init import * + +from tensorflow.contrib import layers +from tensorflow.contrib.framework.python.ops import add_arg_scope +from tensorflow.contrib.framework.python.ops import arg_scope +from tensorflow.contrib.layers.python.layers import layers as layers_lib +from tensorflow.contrib.layers.python.layers import utils +#from tensorflow.contrib.slim.python.slim.nets import resnet_utils +from . import resnet_utils +from tensorflow.python.ops import math_ops +from tensorflow.python.ops import nn_ops +from tensorflow.python.ops import variable_scope +import tensorflow as tf + +resnet_arg_scope = resnet_utils.resnet_arg_scope + + +@add_arg_scope +def bottleneck(inputs, + depth, + depth_bottleneck, + stride, + rate=1, + outputs_collections=None, + scope=None): + """Bottleneck residual unit variant with BN after convolutions. + + This is the original residual unit proposed in [1]. See Fig. 1(a) of [2] for + its definition. Note that we use here the bottleneck variant which has an + extra bottleneck layer. + + When putting together two consecutive ResNet blocks that use this unit, one + should use stride = 2 in the last unit of the first block. + + Args: + inputs: A tensor of size [batch, height, width, channels]. + depth: The depth of the ResNet unit output. + depth_bottleneck: The depth of the bottleneck layers. + stride: The ResNet unit's stride. Determines the amount of downsampling of + the units output compared to its input. + rate: An integer, rate for atrous convolution. + outputs_collections: Collection to add the ResNet unit output. + scope: Optional variable_scope. + + Returns: + The ResNet unit's output. + """ + with variable_scope.variable_scope(scope, 'bottleneck_v1', [inputs]) as sc: + depth_in = utils.last_dimension(inputs.get_shape(), min_rank=4) + if depth == depth_in: + shortcut = resnet_utils.subsample(inputs, stride, 'shortcut') + else: + shortcut = layers.conv2d( + inputs, + depth, [1, 1], + stride=stride, + activation_fn=None, + scope='shortcut') + + residual = layers.conv2d( + inputs, depth_bottleneck, [1, 1], stride=1, scope='conv1') + residual = resnet_utils.conv2d_same( + residual, depth_bottleneck, 3, stride, rate=rate, scope='conv2') + residual = layers.conv2d( + residual, depth, [1, 1], stride=1, activation_fn=None, scope='conv3') + + output = nn_ops.relu(shortcut + residual) + + return utils.collect_named_outputs(outputs_collections, sc.name, output) + + +def resnet_v1(inputs, + blocks, + num_classes=None, + global_pool=True, + output_stride=None, + include_root_block=True, + reuse=None, # 修改 + scope=None): + """Generator for v1 ResNet models. + + This function generates a family of ResNet v1 models. See the resnet_v1_*() + methods for specific model instantiations, obtained by selecting different + block instantiations that produce ResNets of various depths. + + Training for image classification on Imagenet is usually done with [224, 224] + inputs, resulting in [7, 7] feature maps at the output of the last ResNet + block for the ResNets defined in [1] that have nominal stride equal to 32. + However, for dense prediction tasks we advise that one uses inputs with + spatial dimensions that are multiples of 32 plus 1, e.g., [321, 321]. In + this case the feature maps at the ResNet output will have spatial shape + [(height - 1) / output_stride + 1, (width - 1) / output_stride + 1] + and corners exactly aligned with the input image corners, which greatly + facilitates alignment of the features to the image. Using as input [225, 225] + images results in [8, 8] feature maps at the output of the last ResNet block. + + For dense prediction tasks, the ResNet needs to run in fully-convolutional + (FCN) mode and global_pool needs to be set to False. The ResNets in [1, 2] all + have nominal stride equal to 32 and a good choice in FCN mode is to use + output_stride=16 in order to increase the density of the computed features at + small computational and memory overhead, cf. http://arxiv.org/abs/1606.00915. + + Args: + inputs: A tensor of size [batch, height_in, width_in, channels]. + blocks: A list of length equal to the number of ResNet blocks. Each element + is a resnet_utils.Block object describing the units in the block. + num_classes: Number of predicted classes for classification tasks. If None + we return the features before the logit layer. + global_pool: If True, we perform global average pooling before computing the + logits. Set to True for image classification, False for dense prediction. + output_stride: If None, then the output will be computed at the nominal + network stride. If output_stride is not None, it specifies the requested + ratio of input to output spatial resolution. + include_root_block: If True, include the initial convolution followed by + max-pooling, if False excludes it. + reuse: whether or not the network and its variables should be reused. To be + able to reuse 'scope' must be given. + scope: Optional variable_scope. + + Returns: + net: A rank-4 tensor of size [batch, height_out, width_out, channels_out]. + If global_pool is False, then height_out and width_out are reduced by a + factor of output_stride compared to the respective height_in and width_in, + else both height_out and width_out equal one. If num_classes is None, then + net is the output of the last ResNet block, potentially after global + average pooling. If num_classes is not None, net contains the pre-softmax + activations. + end_points: A dictionary from components of the network to the corresponding + activation. + + Raises: + ValueError: If the target output_stride is not valid. + """ + with variable_scope.variable_scope( + scope, 'resnet_v1', [inputs], reuse=reuse) as sc: # 修改 + end_points_collection = sc.original_name_scope + '_end_points' + with arg_scope( + [layers.conv2d, bottleneck, resnet_utils.stack_blocks_dense], + outputs_collections=end_points_collection): + net = inputs + if include_root_block: + if output_stride is not None: + if output_stride % 4 != 0: + raise ValueError('The output_stride needs to be a multiple of 4.') + output_stride /= 4 + net = resnet_utils.conv2d_same(net, 64, 7, stride=2, scope='conv1') + net = layers_lib.max_pool2d(net, [3, 3], stride=2, scope='pool1') + net = resnet_utils.stack_blocks_dense(net, blocks, output_stride) + if global_pool: + # Global average pooling. + net = math_ops.reduce_mean(net, [1, 2], name='pool5', keep_dims=True) + if num_classes is not None: + net = layers.conv2d( + net, + num_classes, [1, 1], + activation_fn=None, + normalizer_fn=None, + scope='logits') + # Convert end_points_collection into a dictionary of end_points. + end_points = utils.convert_collection_to_dict(end_points_collection) + if num_classes is not None: + end_points['predictions'] = layers_lib.softmax(net, scope='predictions') + return net, end_points + + +resnet_v1.default_image_size = 224 + + +def resnet_v1_50(inputs, + num_classes=None, + global_pool=True, + output_stride=None, + reuse=None, # 修改 + scope='resnet_v1_50'): + """ResNet-50 model of [1]. See resnet_v1() for arg and return description.""" + blocks = [ + resnet_utils.Block('block1', bottleneck, + [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block('block2', bottleneck, + [(512, 128, 1)] * 3 + [(512, 128, 2)]), + resnet_utils.Block('block3', bottleneck, + [(1024, 256, 1)] * 5 + [(1024, 256, 2)]), + resnet_utils.Block('block4', bottleneck, [(2048, 512, 1)] * 3) + ] + return resnet_v1( + inputs, + blocks, + num_classes, + global_pool, + output_stride, + include_root_block=True, + reuse=reuse, # 修改 + scope=scope) + + +def resnet_v1_101(inputs, + num_classes=None, + global_pool=True, + output_stride=None, + reuse=None, + scope='resnet_v1_101'): + """ResNet-101 model of [1]. See resnet_v1() for arg and return description.""" + blocks = [ + resnet_utils.Block('block1', bottleneck, + [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block('block2', bottleneck, + [(512, 128, 1)] * 3 + [(512, 128, 2)]), + resnet_utils.Block('block3', bottleneck, + [(1024, 256, 1)] * 22 + [(1024, 256, 2)]), + resnet_utils.Block('block4', bottleneck, [(2048, 512, 1)] * 3) + ] + return resnet_v1( + inputs, + blocks, + num_classes, + global_pool, + output_stride, + include_root_block=True, + reuse=reuse, + scope=scope) + + +def resnet_v1_152(inputs, + num_classes=None, + global_pool=True, + output_stride=None, + reuse=None, + scope='resnet_v1_152'): + """ResNet-152 model of [1]. See resnet_v1() for arg and return description.""" + blocks = [ + resnet_utils.Block('block1', bottleneck, + [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block('block2', bottleneck, + [(512, 128, 1)] * 7 + [(512, 128, 2)]), + resnet_utils.Block('block3', bottleneck, + [(1024, 256, 1)] * 35 + [(1024, 256, 2)]), + resnet_utils.Block('block4', bottleneck, [(2048, 512, 1)] * 3) + ] + return resnet_v1( + inputs, + blocks, + num_classes, + global_pool, + output_stride, + include_root_block=True, + reuse=reuse, + scope=scope) + + +def resnet_v1_200(inputs, + num_classes=None, + global_pool=True, + output_stride=None, + reuse=None, + scope='resnet_v1_200'): + """ResNet-200 model of [2]. See resnet_v1() for arg and return description.""" + blocks = [ + resnet_utils.Block('block1', bottleneck, + [(256, 64, 1)] * 2 + [(256, 64, 2)]), + resnet_utils.Block('block2', bottleneck, + [(512, 128, 1)] * 23 + [(512, 128, 2)]), + resnet_utils.Block('block3', bottleneck, + [(1024, 256, 1)] * 35 + [(1024, 256, 2)]), + resnet_utils.Block('block4', bottleneck, [(2048, 512, 1)] * 3) + ] + return resnet_v1( + inputs, + blocks, + num_classes, + global_pool, + output_stride, + include_root_block=True, + reuse=reuse, + scope=scope) + -- Gitee From 35db0f882da99c4c2c4d7e85ad796247abacda97 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:49:12 +0000 Subject: [PATCH 22/59] first commit --- .../src/lib/nms/__init__.py | 0 .../src/lib/nms/cpu_nms.pyx | 67 ++++++++ .../src/lib/nms/gpu_nms.hpp | 2 + .../src/lib/nms/gpu_nms.pyx | 30 ++++ .../src/lib/nms/nms.py | 121 +++++++++++++++ .../src/lib/nms/nms_kernel.cu | 143 ++++++++++++++++++ .../src/lib/nms/nms_my.py | 121 +++++++++++++++ .../src/lib/nms/setup.py | 142 +++++++++++++++++ 8 files changed, 626 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/__init__.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/cpu_nms.pyx create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/gpu_nms.hpp create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/gpu_nms.pyx create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms_kernel.cu create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms_my.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/setup.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/__init__.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/cpu_nms.pyx b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/cpu_nms.pyx new file mode 100644 index 000000000..59388fe78 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/cpu_nms.pyx @@ -0,0 +1,67 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Modified from py-faster-rcnn (https://github.com/rbgirshick/py-faster-rcnn) +# ------------------------------------------------------------------------------ + +import numpy as np +cimport numpy as np + +cdef inline np.float32_t max(np.float32_t a, np.float32_t b): + return a if a >= b else b + +cdef inline np.float32_t min(np.float32_t a, np.float32_t b): + return a if a <= b else b + +def cpu_nms(np.ndarray[np.float32_t, ndim=2] dets, np.float thresh): + cdef np.ndarray[np.float32_t, ndim=1] x1 = dets[:, 0] + cdef np.ndarray[np.float32_t, ndim=1] y1 = dets[:, 1] + cdef np.ndarray[np.float32_t, ndim=1] x2 = dets[:, 2] + cdef np.ndarray[np.float32_t, ndim=1] y2 = dets[:, 3] + cdef np.ndarray[np.float32_t, ndim=1] scores = dets[:, 4] + + cdef np.ndarray[np.float32_t, ndim=1] areas = (x2 - x1 + 1) * (y2 - y1 + 1) + cdef np.ndarray[np.int_t, ndim=1] order = scores.argsort()[::-1].astype('i') + + cdef int ndets = dets.shape[0] + cdef np.ndarray[np.int_t, ndim=1] suppressed = \ + np.zeros((ndets), dtype=np.int) + + # nominal indices + cdef int _i, _j + # sorted indices + cdef int i, j + # temp variables for box i's (the box currently under consideration) + cdef np.float32_t ix1, iy1, ix2, iy2, iarea + # variables for computing overlap with box j (lower scoring box) + cdef np.float32_t xx1, yy1, xx2, yy2 + cdef np.float32_t w, h + cdef np.float32_t inter, ovr + + keep = [] + for _i in range(ndets): + i = order[_i] + if suppressed[i] == 1: + continue + keep.append(i) + ix1 = x1[i] + iy1 = y1[i] + ix2 = x2[i] + iy2 = y2[i] + iarea = areas[i] + for _j in range(_i + 1, ndets): + j = order[_j] + if suppressed[j] == 1: + continue + xx1 = max(ix1, x1[j]) + yy1 = max(iy1, y1[j]) + xx2 = min(ix2, x2[j]) + yy2 = min(iy2, y2[j]) + w = max(0.0, xx2 - xx1 + 1) + h = max(0.0, yy2 - yy1 + 1) + inter = w * h + ovr = inter / (iarea + areas[j] - inter) + if ovr >= thresh: + suppressed[j] = 1 + + return keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/gpu_nms.hpp b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/gpu_nms.hpp new file mode 100644 index 000000000..68b6d42cd --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/gpu_nms.hpp @@ -0,0 +1,2 @@ +void _nms(int* keep_out, int* num_out, const float* boxes_host, int boxes_num, + int boxes_dim, float nms_overlap_thresh, int device_id); diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/gpu_nms.pyx b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/gpu_nms.pyx new file mode 100644 index 000000000..b6ff660cf --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/gpu_nms.pyx @@ -0,0 +1,30 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Modified from py-faster-rcnn (https://github.com/rbgirshick/py-faster-rcnn) +# ------------------------------------------------------------------------------ + +import numpy as np +cimport numpy as np + +assert sizeof(int) == sizeof(np.int32_t) + +cdef extern from "gpu_nms.hpp": + void _nms(np.int32_t*, int*, np.float32_t*, int, int, float, int) + +def gpu_nms(np.ndarray[np.float32_t, ndim=2] dets, np.float thresh, + np.int32_t device_id=0): + cdef int boxes_num = dets.shape[0] + cdef int boxes_dim = dets.shape[1] + cdef int num_out + cdef np.ndarray[np.int32_t, ndim=1] \ + keep = np.zeros(boxes_num, dtype=np.int32) + cdef np.ndarray[np.float32_t, ndim=1] \ + scores = dets[:, 4] + cdef np.ndarray[np.int32_t, ndim=1] \ + order = scores.argsort()[::-1].astype(np.int32) + cdef np.ndarray[np.float32_t, ndim=2] \ + sorted_dets = dets[order, :] + _nms(&keep[0], &num_out, &sorted_dets[0, 0], boxes_num, boxes_dim, thresh, device_id) + keep = keep[:num_out] + return list(order[keep]) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms.py new file mode 100644 index 000000000..bd86ed0e5 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms.py @@ -0,0 +1,121 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Modified from py-faster-rcnn (https://github.com/rbgirshick/py-faster-rcnn) +# ------------------------------------------------------------------------------ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from npu_bridge.npu_init import * + +import numpy as np + +from .cpu_nms import cpu_nms +from .gpu_nms import gpu_nms + + +def py_nms_wrapper(thresh): + def _nms(dets): + return nms(dets, thresh) + return _nms + + +def cpu_nms_wrapper(thresh): + def _nms(dets): + return cpu_nms(dets, thresh) + return _nms + + +def gpu_nms_wrapper(thresh, device_id): + def _nms(dets): + return gpu_nms(dets, thresh, device_id) + return _nms + + +def nms(dets, thresh): + """ + greedily select boxes with high confidence and overlap with current maximum <= thresh + rule out overlap >= thresh + :param dets: [[x1, y1, x2, y2 score]] + :param thresh: retain overlap < thresh + :return: indexes to keep + """ + if dets.shape[0] == 0: + return [] + + x1 = dets[:, 0] + y1 = dets[:, 1] + x2 = dets[:, 2] + y2 = dets[:, 3] + scores = dets[:, 4] + + areas = (x2 - x1 + 1) * (y2 - y1 + 1) + order = scores.argsort()[::-1] + + keep = [] + while order.size > 0: + i = order[0] + keep.append(i) + xx1 = np.maximum(x1[i], x1[order[1:]]) + yy1 = np.maximum(y1[i], y1[order[1:]]) + xx2 = np.minimum(x2[i], x2[order[1:]]) + yy2 = np.minimum(y2[i], y2[order[1:]]) + + w = np.maximum(0.0, xx2 - xx1 + 1) + h = np.maximum(0.0, yy2 - yy1 + 1) + inter = w * h + ovr = inter / (areas[i] + areas[order[1:]] - inter) + + inds = np.where(ovr <= thresh)[0] + order = order[inds + 1] + + return keep + +def oks_iou(g, d, a_g, a_d, sigmas=None, in_vis_thre=None): + if not isinstance(sigmas, np.ndarray): + sigmas = np.array([.26, .25, .25, .35, .35, .79, .79, .72, .72, .62, .62, 1.07, 1.07, .87, .87, .89, .89]) / 10.0 + vars = (sigmas * 2) ** 2 + xg = g[0::3] + yg = g[1::3] + vg = g[2::3] + ious = np.zeros((d.shape[0])) + for n_d in range(0, d.shape[0]): + xd = d[n_d, 0::3] + yd = d[n_d, 1::3] + vd = d[n_d, 2::3] + dx = xd - xg + dy = yd - yg + e = (dx ** 2 + dy ** 2) / vars / ((a_g + a_d[n_d]) / 2 + np.spacing(1)) / 2 + if in_vis_thre is not None: + ind = list(vg > in_vis_thre) and list(vd > in_vis_thre) + e = e[ind] + ious[n_d] = np.sum(np.exp(-e)) / e.shape[0] if e.shape[0] != 0 else 0.0 + return ious + +def oks_nms(kpts, scores, areas, thresh, sigmas=None, in_vis_thre=None): + """ + greedily select boxes with high confidence and overlap with current maximum <= thresh + rule out overlap >= thresh, overlap = oks + :param kpts_db + :param thresh: retain overlap < thresh + :return: indexes to keep + """ + if len(kpts) == 0: + return [] + + order = scores.argsort()[::-1] + + keep = [] + while order.size > 0: + i = order[0] + keep.append(i) + + oks_ovr = oks_iou(kpts[i], kpts[order[1:]], areas[i], areas[order[1:]], sigmas, in_vis_thre) + + inds = np.where(oks_ovr <= thresh)[0] + order = order[inds + 1] + + return keep + + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms_kernel.cu b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms_kernel.cu new file mode 100644 index 000000000..f6176c6de --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms_kernel.cu @@ -0,0 +1,143 @@ +// ------------------------------------------------------------------ +// Copyright (c) Microsoft +// Licensed under The MIT License +// Modified from MATLAB Faster R-CNN (https://github.com/shaoqingren/faster_rcnn) +// ------------------------------------------------------------------ + +#include "gpu_nms.hpp" +#include +#include + +#define CUDA_CHECK(condition) \ + /* Code block avoids redefinition of cudaError_t error */ \ + do { \ + cudaError_t error = condition; \ + if (error != cudaSuccess) { \ + std::cout << cudaGetErrorString(error) << std::endl; \ + } \ + } while (0) + +#define DIVUP(m,n) ((m) / (n) + ((m) % (n) > 0)) +int const threadsPerBlock = sizeof(unsigned long long) * 8; + +__device__ inline float devIoU(float const * const a, float const * const b) { + float left = max(a[0], b[0]), right = min(a[2], b[2]); + float top = max(a[1], b[1]), bottom = min(a[3], b[3]); + float width = max(right - left + 1, 0.f), height = max(bottom - top + 1, 0.f); + float interS = width * height; + float Sa = (a[2] - a[0] + 1) * (a[3] - a[1] + 1); + float Sb = (b[2] - b[0] + 1) * (b[3] - b[1] + 1); + return interS / (Sa + Sb - interS); +} + +__global__ void nms_kernel(const int n_boxes, const float nms_overlap_thresh, + const float *dev_boxes, unsigned long long *dev_mask) { + const int row_start = blockIdx.y; + const int col_start = blockIdx.x; + + // if (row_start > col_start) return; + + const int row_size = + min(n_boxes - row_start * threadsPerBlock, threadsPerBlock); + const int col_size = + min(n_boxes - col_start * threadsPerBlock, threadsPerBlock); + + __shared__ float block_boxes[threadsPerBlock * 5]; + if (threadIdx.x < col_size) { + block_boxes[threadIdx.x * 5 + 0] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 0]; + block_boxes[threadIdx.x * 5 + 1] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 1]; + block_boxes[threadIdx.x * 5 + 2] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 2]; + block_boxes[threadIdx.x * 5 + 3] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 3]; + block_boxes[threadIdx.x * 5 + 4] = + dev_boxes[(threadsPerBlock * col_start + threadIdx.x) * 5 + 4]; + } + __syncthreads(); + + if (threadIdx.x < row_size) { + const int cur_box_idx = threadsPerBlock * row_start + threadIdx.x; + const float *cur_box = dev_boxes + cur_box_idx * 5; + int i = 0; + unsigned long long t = 0; + int start = 0; + if (row_start == col_start) { + start = threadIdx.x + 1; + } + for (i = start; i < col_size; i++) { + if (devIoU(cur_box, block_boxes + i * 5) > nms_overlap_thresh) { + t |= 1ULL << i; + } + } + const int col_blocks = DIVUP(n_boxes, threadsPerBlock); + dev_mask[cur_box_idx * col_blocks + col_start] = t; + } +} + +void _set_device(int device_id) { + int current_device; + CUDA_CHECK(cudaGetDevice(¤t_device)); + if (current_device == device_id) { + return; + } + // The call to cudaSetDevice must come before any calls to Get, which + // may perform initialization using the GPU. + CUDA_CHECK(cudaSetDevice(device_id)); +} + +void _nms(int* keep_out, int* num_out, const float* boxes_host, int boxes_num, + int boxes_dim, float nms_overlap_thresh, int device_id) { + _set_device(device_id); + + float* boxes_dev = NULL; + unsigned long long* mask_dev = NULL; + + const int col_blocks = DIVUP(boxes_num, threadsPerBlock); + + CUDA_CHECK(cudaMalloc(&boxes_dev, + boxes_num * boxes_dim * sizeof(float))); + CUDA_CHECK(cudaMemcpy(boxes_dev, + boxes_host, + boxes_num * boxes_dim * sizeof(float), + cudaMemcpyHostToDevice)); + + CUDA_CHECK(cudaMalloc(&mask_dev, + boxes_num * col_blocks * sizeof(unsigned long long))); + + dim3 blocks(DIVUP(boxes_num, threadsPerBlock), + DIVUP(boxes_num, threadsPerBlock)); + dim3 threads(threadsPerBlock); + nms_kernel<<>>(boxes_num, + nms_overlap_thresh, + boxes_dev, + mask_dev); + + std::vector mask_host(boxes_num * col_blocks); + CUDA_CHECK(cudaMemcpy(&mask_host[0], + mask_dev, + sizeof(unsigned long long) * boxes_num * col_blocks, + cudaMemcpyDeviceToHost)); + + std::vector remv(col_blocks); + memset(&remv[0], 0, sizeof(unsigned long long) * col_blocks); + + int num_to_keep = 0; + for (int i = 0; i < boxes_num; i++) { + int nblock = i / threadsPerBlock; + int inblock = i % threadsPerBlock; + + if (!(remv[nblock] & (1ULL << inblock))) { + keep_out[num_to_keep++] = i; + unsigned long long *p = &mask_host[0] + i * col_blocks; + for (int j = nblock; j < col_blocks; j++) { + remv[j] |= p[j]; + } + } + } + *num_out = num_to_keep; + + CUDA_CHECK(cudaFree(boxes_dev)); + CUDA_CHECK(cudaFree(mask_dev)); +} diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms_my.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms_my.py new file mode 100644 index 000000000..f1a3acc0c --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/nms_my.py @@ -0,0 +1,121 @@ +# ------------------------------------------------------------------------------ +# Copyright (c) Microsoft +# Licensed under the MIT License. +# Modified from py-faster-rcnn (https://github.com/rbgirshick/py-faster-rcnn) +# ------------------------------------------------------------------------------ + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from npu_bridge.npu_init import * + +import numpy as np + +# from .cpu_nms import cpu_nms +# from .gpu_nms import gpu_nms + + +def py_nms_wrapper(thresh): + def _nms(dets): + return nms(dets, thresh) + return _nms + + +# def cpu_nms_wrapper(thresh): +# def _nms(dets): +# return cpu_nms(dets, thresh) +# return _nms +# +# +# def gpu_nms_wrapper(thresh, device_id): +# def _nms(dets): +# return gpu_nms(dets, thresh, device_id) +# return _nms + + +def nms(dets, thresh): + """ + greedily select boxes with high confidence and overlap with current maximum <= thresh + rule out overlap >= thresh + :param dets: [[x1, y1, x2, y2 score]] + :param thresh: retain overlap < thresh + :return: indexes to keep + """ + if dets.shape[0] == 0: + return [] + + x1 = dets[:, 0] + y1 = dets[:, 1] + x2 = dets[:, 2] + y2 = dets[:, 3] + scores = dets[:, 4] + + areas = (x2 - x1 + 1) * (y2 - y1 + 1) + order = scores.argsort()[::-1] + + keep = [] + while order.size > 0: + i = order[0] + keep.append(i) + xx1 = np.maximum(x1[i], x1[order[1:]]) + yy1 = np.maximum(y1[i], y1[order[1:]]) + xx2 = np.minimum(x2[i], x2[order[1:]]) + yy2 = np.minimum(y2[i], y2[order[1:]]) + + w = np.maximum(0.0, xx2 - xx1 + 1) + h = np.maximum(0.0, yy2 - yy1 + 1) + inter = w * h + ovr = inter / (areas[i] + areas[order[1:]] - inter) + + inds = np.where(ovr <= thresh)[0] + order = order[inds + 1] + + return keep + +def oks_iou(g, d, a_g, a_d, sigmas=None, in_vis_thre=None): + if not isinstance(sigmas, np.ndarray): + sigmas = np.array([.26, .25, .25, .35, .35, .79, .79, .72, .72, .62, .62, 1.07, 1.07, .87, .87, .89, .89]) / 10.0 + vars = (sigmas * 2) ** 2 + xg = g[0::3] + yg = g[1::3] + vg = g[2::3] + ious = np.zeros((d.shape[0])) + for n_d in range(0, d.shape[0]): + xd = d[n_d, 0::3] + yd = d[n_d, 1::3] + vd = d[n_d, 2::3] + dx = xd - xg + dy = yd - yg + e = (dx ** 2 + dy ** 2) / vars / ((a_g + a_d[n_d]) / 2 + np.spacing(1)) / 2 + if in_vis_thre is not None: + ind = list(vg > in_vis_thre) and list(vd > in_vis_thre) + e = e[ind] + ious[n_d] = np.sum(np.exp(-e)) / e.shape[0] if e.shape[0] != 0 else 0.0 + return ious + +def oks_nms(kpts, scores, areas, thresh, sigmas=None, in_vis_thre=None): + """ + greedily select boxes with high confidence and overlap with current maximum <= thresh + rule out overlap >= thresh, overlap = oks + :param kpts_db + :param thresh: retain overlap < thresh + :return: indexes to keep + """ + if len(kpts) == 0: + return [] + + order = scores.argsort()[::-1] + + keep = [] + while order.size > 0: + i = order[0] + keep.append(i) + + oks_ovr = oks_iou(kpts[i], kpts[order[1:]], areas[i], areas[order[1:]], sigmas, in_vis_thre) + + inds = np.where(oks_ovr <= thresh)[0] + order = order[inds + 1] + + return keep + + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/setup.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/setup.py new file mode 100644 index 000000000..70221d182 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/nms/setup.py @@ -0,0 +1,142 @@ +# -------------------------------------------------------- +# Copyright (c) Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Modified from py-faster-rcnn (https://github.com/rbgirshick/py-faster-rcnn) +# -------------------------------------------------------- + +from npu_bridge.npu_init import * +import os +from os.path import join as pjoin +from setuptools import setup +from distutils.extension import Extension +from Cython.Distutils import build_ext +import numpy as np + + +def find_in_path(name, path): + "Find a file in a search path" + # Adapted fom + # http://code.activestate.com/recipes/52224-find-a-file-given-a-search-path/ + for dir in path.split(os.pathsep): + binpath = pjoin(dir, name) + if os.path.exists(binpath): + return os.path.abspath(binpath) + return None + + +def locate_cuda(): + """Locate the CUDA environment on the system + Returns a dict with keys 'home', 'nvcc', 'include', and 'lib64' + and values giving the absolute path to each directory. + Starts by looking for the CUDAHOME env variable. If not found, everything + is based on finding 'nvcc' in the PATH. + """ + + # first check if the CUDAHOME env variable is in use + if 'CUDAHOME' in os.environ: + home = os.environ['CUDAHOME'] + nvcc = pjoin(home, 'bin', 'nvcc') + else: + # otherwise, search the PATH for NVCC + default_path = pjoin(os.sep, 'usr', 'local', 'cuda', 'bin') + nvcc = find_in_path('nvcc', os.environ['PATH'] + os.pathsep + default_path) + if nvcc is None: + raise EnvironmentError('The nvcc binary could not be ' + 'located in your $PATH. Either add it to your path, or set $CUDAHOME') + home = os.path.dirname(os.path.dirname(nvcc)) + + cudaconfig = {'home': home, 'nvcc': nvcc, + 'include': pjoin(home, 'include'), + 'lib64': pjoin(home, 'lib64')} + for k, v in cudaconfig.items(): + if not os.path.exists(v): + raise EnvironmentError('The CUDA %s path could not be located in %s' % (k, v)) + + return cudaconfig + + +CUDA = locate_cuda() + +# Obtain the numpy include directory. This logic works across numpy versions. +try: + numpy_include = np.get_include() +except AttributeError: + numpy_include = np.get_numpy_include() + + +def customize_compiler_for_nvcc(self): + """inject deep into distutils to customize how the dispatch + to gcc/nvcc works. + If you subclass UnixCCompiler, it's not trivial to get your subclass + injected in, and still have the right customizations (i.e. + distutils.sysconfig.customize_compiler) run on it. So instead of going + the OO route, I have this. Note, it's kindof like a wierd functional + subclassing going on.""" + + # tell the compiler it can processes .cu + self.src_extensions.append('.cu') + + # save references to the default compiler_so and _comple methods + default_compiler_so = self.compiler_so + super = self._compile + + # now redefine the _compile method. This gets executed for each + # object but distutils doesn't have the ability to change compilers + # based on source extension: we add it. + def _compile(obj, src, ext, cc_args, extra_postargs, pp_opts): + if os.path.splitext(src)[1] == '.cu': + # use the cuda for .cu files + self.set_executable('compiler_so', CUDA['nvcc']) + # use only a subset of the extra_postargs, which are 1-1 translated + # from the extra_compile_args in the Extension class + postargs = extra_postargs['nvcc'] + else: + postargs = extra_postargs['gcc'] + + super(obj, src, ext, cc_args, postargs, pp_opts) + # reset the default compiler_so, which we might have changed for cuda + self.compiler_so = default_compiler_so + + # inject our redefined _compile method into the class + self._compile = _compile + + +# run the customize_compiler +class custom_build_ext(build_ext): + def build_extensions(self): + customize_compiler_for_nvcc(self.compiler) + build_ext.build_extensions(self) + + +ext_modules = [ + Extension( + "cpu_nms", + ["cpu_nms.pyx"], + extra_compile_args={'gcc': ["-Wno-cpp", "-Wno-unused-function"]}, + include_dirs=[numpy_include] + ), + Extension('gpu_nms', + ['nms_kernel.cu', 'gpu_nms.pyx'], + library_dirs=[CUDA['lib64']], + libraries=['cudart'], + language='c++', + runtime_library_dirs=[CUDA['lib64']], + # this syntax is specific to this build system + # we're only going to use certain compiler args with nvcc and not with + # gcc the implementation of this trick is in customize_compiler() below + extra_compile_args={'gcc': ["-Wno-unused-function"], + 'nvcc': ['-arch=sm_35', + '--ptxas-options=-v', + '-c', + '--compiler-options', + "'-fPIC'"]}, + include_dirs=[numpy_include, CUDA['include']] + ), +] + +setup( + name='nms', + ext_modules=ext_modules, + # inject our custom trigger + cmdclass={'build_ext': custom_build_ext}, +) -- Gitee From 77fbfbcd1be38978b786983555728be4bc67e614 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:49:34 +0000 Subject: [PATCH 23/59] first commit --- .../src/lib/tfflat/__init__.py | 0 .../src/lib/tfflat/base.py | 431 ++++++++++++++++++ .../src/lib/tfflat/data_provider.py | 374 +++++++++++++++ .../src/lib/tfflat/dpflow.py | 40 ++ .../src/lib/tfflat/logger.py | 51 +++ .../src/lib/tfflat/mp_utils.py | 135 ++++++ .../src/lib/tfflat/mp_utils_my.py | 135 ++++++ .../src/lib/tfflat/net_utils.py | 120 +++++ .../src/lib/tfflat/saver.py | 69 +++ .../src/lib/tfflat/serialize.py | 80 ++++ .../src/lib/tfflat/timer.py | 40 ++ .../src/lib/tfflat/utils.py | 54 +++ 12 files changed, 1529 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/__init__.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/base.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/data_provider.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/dpflow.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/logger.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/mp_utils.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/mp_utils_my.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/net_utils.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/saver.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/serialize.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/timer.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/utils.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/__init__.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/base.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/base.py new file mode 100644 index 000000000..d6756bd89 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/base.py @@ -0,0 +1,431 @@ +from npu_bridge.npu_init import * +import tensorflow as tf +import tensorflow.contrib.slim as slim +import numpy as np +from collections import OrderedDict as dict +import setproctitle +import os +import os.path as osp +import glob +import abc +import math + +from .net_utils import average_gradients, aggregate_batch, get_optimizer, get_tower_summary_dict +from .saver import load_model, Saver +from .timer import Timer +from .logger import colorlogger +from .utils import approx_equal + + +class ModelDesc(object): + __metaclass__ = abc.ABCMeta + + def __init__(self): + self._loss = None + self._inputs = [] + self._outputs = [] + self._tower_summary = [] + + def set_inputs(self, *vars): + self._inputs = vars + + def set_outputs(self, *vars): + self._outputs = vars + + def set_loss(self, var): + if not isinstance(var, tf.Tensor): + raise ValueError("Loss must be an single tensor.") + # assert var.get_shape() == [], 'Loss tensor must be a scalar shape but got {} shape'.format(var.get_shape()) + self._loss = var + + def get_loss(self, include_wd=False): + if self._loss is None: + raise ValueError("Network doesn't define the final loss") + + if include_wd: + weight_decay = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) + weight_decay = tf.add_n(weight_decay) + return self._loss + weight_decay + else: + return self._loss + + def get_inputs(self): + if len(self._inputs) == 0: + raise ValueError("Network doesn't define the inputs") + return self._inputs + + def get_outputs(self): + if len(self._outputs) == 0: + raise ValueError("Network doesn't define the outputs") + return self._outputs + + def add_tower_summary(self, name, vars, reduced_method='mean'): + assert reduced_method == 'mean' or reduced_method == 'sum', \ + "Summary tensor only supports sum- or mean- reduced method" + if isinstance(vars, list): + for v in vars: + if vars.get_shape() == None: + print('Summary tensor {} got an unknown shape.'.format(name)) + else: + assert v.get_shape().as_list() == [], \ + "Summary tensor only supports scalar but got {}".format(v.get_shape().as_list()) + tf.add_to_collection(name, v) + else: + if vars.get_shape() == None: + print('Summary tensor {} got an unknown shape.'.format(name)) + else: + assert vars.get_shape().as_list() == [], \ + "Summary tensor only supports scalar but got {}".format(vars.get_shape().as_list()) + tf.add_to_collection(name, vars) + self._tower_summary.append([name, reduced_method]) + + @abc.abstractmethod + def make_network(self, is_train): + pass + + +class Base(object): + __metaclass__ = abc.ABCMeta + """ + build graph: + _make_graph + make_inputs + make_network + add_tower_summary + get_summary + + train/test + """ + + def __init__(self, net, cfg, data_iter=None, log_name='logs.txt'): + self._input_list = [] + self._output_list = [] + self._outputs = [] + self.graph_ops = None + + self.net = net + self.cfg = cfg + + self.cur_epoch = 0 + + self.summary_dict = {} + + # timer + self.tot_timer = Timer() + self.gpu_timer = Timer() + self.read_timer = Timer() + + # logger + self.logger = colorlogger(cfg.log_dir, log_name=log_name) + + # initialize tensorflow + tfconfig = tf.ConfigProto(allow_soft_placement=True, log_device_placement=False) + tfconfig.gpu_options.allow_growth = True + self.sess = tf.Session(config=npu_config_proto(config_proto=tfconfig)) + + # build_graph + self.build_graph() + + # get data iter + self._data_iter = data_iter + + @abc.abstractmethod + def _make_data(self): + return + + @abc.abstractmethod + def _make_graph(self): + return + + def build_graph(self): + # all variables should be in the same graph and stored in cpu. + with tf.device('/cpu:0'): + tf.set_random_seed(2333) + self.graph_ops = self._make_graph() + if not isinstance(self.graph_ops, list) and not isinstance(self.graph_ops, tuple): + self.graph_ops = [self.graph_ops] + self.summary_dict.update(get_tower_summary_dict(self.net._tower_summary)) + + def load_weights(self, model=None): + + if model == 'last_epoch': + sfiles = os.path.join(self.cfg.model_dump_dir, 'snapshot_*.ckpt.meta') + sfiles = glob.glob(sfiles) + if len(sfiles) > 0: + sfiles.sort(key=os.path.getmtime) + sfiles = [i[:-5] for i in sfiles if i.endswith('.meta')] + model = sfiles[-1] + else: + self.logger.critical('No snapshot model exists.') + return + + if isinstance(model, int): + model = os.path.join(self.cfg.model_dump_dir_test, 'snapshot_%d.ckpt' % model) # 修改 + + if isinstance(model, str) and (osp.exists(model + '.meta') or osp.exists(model)): + self.logger.info('Initialized model weights from {} ...'.format(model)) + load_model(self.sess, model) + if model.split('/')[-1].startswith('snapshot_'): + self.cur_epoch = int(model[model.find('snapshot_') + 9:model.find('.ckpt')]) + self.logger.info('Current epoch is %d.' % self.cur_epoch) + else: + self.logger.critical('Load nothing. There is no model in path {}.'.format(model)) + + def next_feed(self): + if self._data_iter is None: + raise ValueError('No input data.') + feed_dict = dict() + for inputs in self._input_list: + # print("inputs:", self.sess.run(inputs)) + blobs = next(self._data_iter) + for i, inp in enumerate(inputs): + inp_shape = inp.get_shape().as_list() + if None in inp_shape: + feed_dict[inp] = blobs[i] + else: + feed_dict[inp] = blobs[i].reshape(*inp_shape) + return feed_dict + + +class Trainer(Base): + def __init__(self, net, cfg, data_iter=None): + self.lr_eval = cfg.lr + self.lr = tf.Variable(cfg.lr, trainable=False) + self._optimizer = get_optimizer(self.lr, cfg.optimizer) + + super(Trainer, self).__init__(net, cfg, data_iter, log_name='train_logs.txt') + + # make data + self._data_iter, self.itr_per_epoch = self._make_data() + + def _make_data(self): + from dataset import Dataset + from gen_batch import generate_batch + + d = Dataset() + train_data = d.load_train_data() + + from tfflat.data_provider import DataFromList, MultiProcessMapDataZMQ, BatchData, MapData + data_load_thread = DataFromList(train_data) + if self.cfg.multi_thread_enable: + data_load_thread = MultiProcessMapDataZMQ(data_load_thread, self.cfg.num_thread, generate_batch, + strict=True) + else: + data_load_thread = MapData(data_load_thread, generate_batch) + data_load_thread = BatchData(data_load_thread, self.cfg.batch_size) + + data_load_thread.reset_state() + dataiter = data_load_thread.get_data() + + return dataiter, math.ceil(len(train_data) / self.cfg.batch_size / self.cfg.num_gpus) + + def _make_graph(self): + self.logger.info("Generating training graph on {} GPUs ...".format(self.cfg.num_gpus)) + + weights_initializer = slim.xavier_initializer() + biases_initializer = tf.constant_initializer(0.) + biases_regularizer = tf.no_regularizer + weights_regularizer = tf.contrib.layers.l2_regularizer(self.cfg.weight_decay) + + tower_grads = [] + with tf.variable_scope(tf.get_variable_scope()): + for i in range(self.cfg.num_gpus): + with tf.device('/cpu:0'): + with tf.name_scope('tower_%d' % i) as name_scope: + # Force all Variables to reside on the CPU. + with slim.arg_scope([slim.model_variable, slim.variable], device='/device:CPU:0'): + with slim.arg_scope([slim.conv2d, slim.conv2d_in_plane, \ + slim.conv2d_transpose, slim.separable_conv2d, + slim.fully_connected], + weights_regularizer=weights_regularizer, + biases_regularizer=biases_regularizer, + weights_initializer=weights_initializer, + biases_initializer=biases_initializer): + # loss over single GPU + self.net.make_network(is_train=True) + if i == self.cfg.num_gpus - 1: + loss = self.net.get_loss(include_wd=True) + else: + loss = self.net.get_loss() + self._input_list.append(self.net.get_inputs()) + + tf.get_variable_scope().reuse_variables() + + if i == 0: + if self.cfg.num_gpus > 1 and self.cfg.bn_train is True: + self.logger.warning("BN is calculated only on single GPU.") + extra_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS, name_scope) + with tf.control_dependencies(extra_update_ops): + grads = self._optimizer.compute_gradients(loss) + else: + grads = self._optimizer.compute_gradients(loss) + final_grads = [] + with tf.variable_scope('Gradient_Mult') as scope: + for grad, var in grads: + final_grads.append((grad, var)) + tower_grads.append(final_grads) + + if len(tower_grads) > 1: + grads = average_gradients(tower_grads) + else: + grads = tower_grads[0] + + apply_gradient_op = self._optimizer.apply_gradients(grads) + train_op = tf.group(apply_gradient_op, *extra_update_ops) + + return train_op + + def train(self): + + # saver + self.logger.info('Initialize saver ...') + train_saver = Saver(self.sess, tf.global_variables(), self.cfg.model_dump_dir) + + # initialize weights + self.logger.info('Initialize all variables ...') + self.sess.run(tf.variables_initializer(tf.global_variables(), name='init')) + self.load_weights('last_epoch' if self.cfg.continue_train else self.cfg.init_model) + + self.logger.info('Start training ...') + start_itr = self.cur_epoch * self.itr_per_epoch + 1 + end_itr = self.itr_per_epoch * self.cfg.end_epoch + 1 + for itr in range(start_itr, end_itr): + self.tot_timer.tic() + + self.cur_epoch = itr // self.itr_per_epoch + setproctitle.setproctitle('train epoch:' + str(self.cur_epoch)) + + # apply current learning policy + cur_lr = self.cfg.get_lr(self.cur_epoch) + if not approx_equal(cur_lr, self.lr_eval): + print(self.lr_eval, cur_lr) + self.sess.run(tf.assign(self.lr, cur_lr)) + + # input data + self.read_timer.tic() + feed_dict = self.next_feed() + self.read_timer.toc() + + # train one step + self.gpu_timer.tic() + _, self.lr_eval, *summary_res = self.sess.run( + [self.graph_ops[0], self.lr, *self.summary_dict.values()], feed_dict=feed_dict) + self.gpu_timer.toc() + + itr_summary = dict() + for i, k in enumerate(self.summary_dict.keys()): + itr_summary[k] = summary_res[i] + + screen = [ + 'Epoch %d itr %d/%d:' % (self.cur_epoch, itr, self.itr_per_epoch), + 'lr: %g' % (self.lr_eval), + 'speed: %.2f(%.2fs r%.2f)s/itr' % ( + self.tot_timer.average_time, self.gpu_timer.average_time, self.read_timer.average_time), + '%.2fh/epoch' % (self.tot_timer.average_time / 3600. * self.itr_per_epoch), + ' '.join(map(lambda x: '%s: %.4f' % (x[0], x[1]), itr_summary.items())), + ] + + # TODO(display stall?) + if itr % self.cfg.display == 0: + self.logger.info(' '.join(screen)) + + if itr % self.itr_per_epoch == 0: + train_saver.save_model(self.cur_epoch) + + self.tot_timer.toc() + + +class Tester(Base): + def __init__(self, net, cfg, data_iter=None): + super(Tester, self).__init__(net, cfg, data_iter, log_name='test_logs.txt') + + def next_feed(self, batch_data=None): + if self._data_iter is None and batch_data is None: + raise ValueError('No input data.') + feed_dict = dict() + if batch_data is None: + for inputs in self._input_list: + blobs = next(self._data_iter) + for i, inp in enumerate(inputs): + inp_shape = inp.get_shape().as_list() + if None in inp_shape: + feed_dict[inp] = blobs[i] + else: + feed_dict[inp] = blobs[i].reshape(*inp_shape) + else: + assert isinstance(batch_data, list) or isinstance(batch_data, tuple), "Input data should be list-type." + assert len(batch_data) == len(self._input_list[0]), "Input data is incomplete." + + batch_size = self.cfg.batch_size + if self._input_list[0][0].get_shape().as_list()[0] is None: + # fill batch + for i in range(len(batch_data)): + batch_size = (len(batch_data[i]) + self.cfg.num_gpus - 1) // self.cfg.num_gpus + total_batches = batch_size * self.cfg.num_gpus + left_batches = total_batches - len(batch_data[i]) + if left_batches > 0: + batch_data[i] = np.append(batch_data[i], np.zeros((left_batches, *batch_data[i].shape[1:])), + axis=0) + self.logger.warning("Fill some blanks to fit batch_size which wastes %d%% computation" % ( + left_batches * 100. / total_batches)) + else: + assert self.cfg.batch_size * self.cfg.num_gpus == len(batch_data[0]), \ + "Input batch doesn't fit placeholder batch." + + for j, inputs in enumerate(self._input_list): + for i, inp in enumerate(inputs): + feed_dict[inp] = batch_data[i][j * batch_size: (j + 1) * batch_size] + + # @TODO(delete) + assert (j + 1) * batch_size == len(batch_data[0]), 'check batch' + return feed_dict, batch_size + + def _make_graph(self): + self.logger.info("Generating testing graph on {} GPUs ...".format(self.cfg.num_gpus)) + + with tf.variable_scope(tf.get_variable_scope()): + for i in range(self.cfg.num_gpus): + with tf.device('/cpu:0'): + with tf.name_scope('tower_%d' % i) as name_scope: + with slim.arg_scope([slim.model_variable, slim.variable], device='/device:CPU:0'): + self.net.make_network(is_train=False) + self._input_list.append(self.net.get_inputs()) + self._output_list.append(self.net.get_outputs()) + + tf.get_variable_scope().reuse_variables() + + self._outputs = aggregate_batch(self._output_list) + + # run_meta = tf.RunMetadata() + # opts = tf.profiler.ProfileOptionBuilder.float_operation() + # flops = tf.profiler.profile(self.sess.graph, run_meta=run_meta, cmd='op', options=opts) + # + # opts = tf.profiler.ProfileOptionBuilder.trainable_variables_parameter() + # params = tf.profiler.profile(self.sess.graph, run_meta=run_meta, cmd='op', options=opts) + + # print("{:,} --- {:,}".format(flops.total_float_ops, params.total_parameters)) + # from IPython import embed; embed() + + return self._outputs + + def predict_one(self, data=None): + # TODO(reduce data in limited batch) + assert len(self.summary_dict) == 0, "still not support scalar summary in testing stage" + setproctitle.setproctitle('test epoch:' + str(self.cur_epoch)) + + self.read_timer.tic() + feed_dict, batch_size = self.next_feed(data) + self.read_timer.toc() + + self.gpu_timer.tic() + res = self.sess.run([*self.graph_ops, *self.summary_dict.values()], feed_dict=feed_dict) + self.gpu_timer.toc() + + if data is not None and len(data[0]) < self.cfg.num_gpus * batch_size: + for i in range(len(res)): + res[i] = res[i][:len(data[0])] + + return res + + def test(self): + pass diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/data_provider.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/data_provider.py new file mode 100644 index 000000000..1d94c6f5b --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/data_provider.py @@ -0,0 +1,374 @@ +# copy from tensorpack: https://github.com/ppwwyyxx/tensorpack +from npu_bridge.npu_init import * +import numpy as np +import threading +import multiprocessing as mp +import weakref +from contextlib import contextmanager +from .serialize import loads, dumps +import errno +import uuid +import os +import zmq +import atexit +from itertools import cycle +from copy import copy +from .utils import get_rng +from setproctitle import setproctitle + +def del_weakref(x): + o = x() + if o is not None: + o.__del__() + +@contextmanager +def _zmq_catch_error(name): + try: + yield + except zmq.ContextTerminated: + print("[{}] Context terminated.".format(name)) + raise Exception + except zmq.ZMQError as e: + if e.errno == errno.ENOTSOCK: # socket closed + print("[{}] Socket closed.".format(name)) + raise Exception + else: + raise + except Exception: + raise + +class DataFlowReentrantGuard(object): + """ + A tool to enforce non-reentrancy. + Mostly used on DataFlow whose :meth:`get_data` is stateful, + so that multiple instances of the iterator cannot co-exist. + """ + def __init__(self): + self._lock = threading.Lock() + + def __enter__(self): + self._succ = self._lock.acquire(False) + if not self._succ: + raise threading.ThreadError("This DataFlow is not reentrant!") + + def __exit__(self, exc_type, exc_val, exc_tb): + self._lock.release() + return False + +class DataFromList(object): + def __init__(self, datalist, is_train=True, shuffle=True): + self.rng = get_rng() + self._datalist = datalist + self._shuffle = shuffle + self._is_train = is_train + + def get_data(self): + if self._is_train: + while True: + idxs = np.arange(len(self._datalist)) + if self._shuffle: + self.rng.shuffle(idxs) + for i in idxs: + yield self._datalist[i] + else: + idxs = np.arange(len(self._datalist)) + if self._shuffle: + self.rng.shuffle(idxs) + for i in idxs: + yield self._datalist[i] + + def reset_state(self): + self.rng = get_rng() + +class _ParallelMapData(object): + def __init__(self, ds, buffer_size): + assert buffer_size > 0, buffer_size + self._buffer_size = buffer_size + self._buffer_occupancy = 0 # actual #elements in buffer + + self.ds = ds + + def _recv(self): + pass + + def _send(self, dp): + pass + + def _recv_filter_none(self): + ret = self._recv() + assert ret is not None, \ + "[{}] Map function cannot return None when strict mode is used.".format(type(self).__name__) + return ret + + def _fill_buffer(self, cnt=None): + if cnt is None: + cnt = self._buffer_size - self._buffer_occupancy + try: + for _ in range(cnt): + dp = next(self._iter) + self._send(dp) + except StopIteration: + print( + "[{}] buffer_size cannot be larger than the size of the DataFlow!".format(type(self).__name__)) + raise + self._buffer_occupancy += cnt + + def get_data_non_strict(self): + for dp in self._iter: + self._send(dp) + ret = self._recv() + if ret is not None: + yield ret + + self._iter = self.ds.get_data() # refresh + for _ in range(self._buffer_size): + self._send(next(self._iter)) + ret = self._recv() + if ret is not None: + yield ret + + def get_data_strict(self): + self._fill_buffer() + for dp in self._iter: + self._send(dp) + yield self._recv_filter_none() + self._iter = self.ds.get_data() # refresh + + # first clear the buffer, then fill + for k in range(self._buffer_size): + dp = self._recv_filter_none() + self._buffer_occupancy -= 1 + if k == self._buffer_size - 1: + self._fill_buffer() + yield dp + +class MapData(object): + """ + Apply a mapper/filter on the DataFlow. + + Note: + 1. Please make sure func doesn't modify the components + unless you're certain it's safe. + 2. If you discard some datapoints, ``ds.size()`` will be incorrect. + """ + + def __init__(self, ds, func): + """ + Args: + ds (DataFlow): input DataFlow + func (datapoint -> datapoint | None): takes a datapoint and returns a new + datapoint. Return None to discard this datapoint. + """ + self.ds = ds + self.func = func + + def get_data(self): + for dp in self.ds.get_data(): + ret = self.func(copy(dp)) # shallow copy the list + if ret is not None: + yield ret + + def reset_state(self): + pass + +class MultiProcessMapDataZMQ(_ParallelMapData): + """ + Same as :class:`MapData`, but start processes to run the mapping function, + and communicate with ZeroMQ pipe. + + Note: + 1. Processes run in parallel and can take different time to run the + mapping function. Therefore the order of datapoints won't be + preserved, and datapoints from one pass of `df.get_data()` might get + mixed with datapoints from the next pass. + + You can use **strict mode**, where `MultiProcessMapData.get_data()` + is guranteed to produce the exact set which `df.get_data()` + produces. Although the order of data still isn't preserved. + """ + class _Worker(mp.Process): + def __init__(self, identity, map_func, pipename, hwm): + super(MultiProcessMapDataZMQ._Worker, self).__init__() + self.identity = identity + self.map_func = map_func + self.pipename = pipename + self.hwm = hwm + + def run(self): + print('Start data provider {}-{}'.format(self.pipename, self.identity)) + setproctitle('data provider {}-{}'.format(self.pipename, self.identity)) + ctx = zmq.Context() + socket = ctx.socket(zmq.DEALER) + socket.setsockopt(zmq.IDENTITY, self.identity) + socket.set_hwm(self.hwm) + socket.connect(self.pipename) + + while True: + dp = loads(socket.recv(copy=False).bytes) + dp = self.map_func(dp) + socket.send(dumps(dp), copy=False) + + def __init__(self, ds, nr_proc, map_func, buffer_size=200, strict=False): + """ + Args: + ds (DataFlow): the dataflow to map + nr_proc(int): number of threads to use + map_func (callable): datapoint -> datapoint | None + buffer_size (int): number of datapoints in the buffer + strict (bool): use "strict mode", see notes above. + """ + _ParallelMapData.__init__(self, ds, buffer_size) + self.nr_proc = nr_proc + self.map_func = map_func + self._strict = strict + self._procs = [] + self._guard = DataFlowReentrantGuard() + + self._reset_done = False + self._procs = [] + + def _reset_once(self): + self.context = zmq.Context() + self.socket = self.context.socket(zmq.ROUTER) + self.socket.set_hwm(self._buffer_size * 2) + pipename = "ipc://@{}-pipe-{}".format('dataflow-map', str(uuid.uuid1())[:8]) + + try: + self.socket.bind(pipename) + except zmq.ZMQError: + print( + "ZMQError in socket.bind(). Perhaps you're \ + using pipes on a non-local file system. See documentation of PrefetchDataZMQ for more information.") + raise + + self._proc_ids = [u'{}'.format(k).encode('utf-8') for k in range(self.nr_proc)] + worker_hwm = int(self._buffer_size * 2 // self.nr_proc) + self._procs = [MultiProcessMapDataZMQ._Worker( + self._proc_ids[k], self.map_func, pipename, worker_hwm) + for k in range(self.nr_proc)] + + self.ds.reset_state() + self._iter = self.ds.get_data() + self._iter_worker = cycle(iter(self._proc_ids)) + + for p in self._procs: + p.deamon = True + p.start() + self._fill_buffer() # pre-fill the bufer + + def reset_state(self): + if self._reset_done: + return + self._reset_done = True + + # __del__ not guranteed to get called at exit + atexit.register(del_weakref, weakref.ref(self)) + + self._reset_once() # build processes + + def _send(self, dp): + # round-robin assignment + worker = next(self._iter_worker) + msg = [worker, dumps(dp)] + self.socket.send_multipart(msg, copy=False) + + def _recv(self): + msg = self.socket.recv_multipart(copy=False) + dp = loads(msg[1].bytes) + return dp + + def get_data(self): + with self._guard, _zmq_catch_error('MultiProcessMapData'): + if self._strict: + for dp in self.get_data_strict(): + yield dp + else: + for dp in self.get_data_non_strict(): + yield dp + + def __del__(self): + try: + if not self._reset_done: + return + if not self.context.closed: + self.socket.close(0) + self.context.destroy(0) + for x in self._procs: + x.terminate() + x.join(5) + print("{} successfully cleaned-up.".format(type(self).__name__)) + except Exception: + pass + +class BatchData(object): + """ + Stack datapoints into batches. + It produces datapoints of the same number of components as ``ds``, but + each component has one new extra dimension of size ``batch_size``. + The batch can be either a list of original components, or (by default) + a numpy array of original components. + """ + + def __init__(self, ds, batch_size, use_list=False): + """ + Args: + ds (DataFlow): When ``use_list=False``, the components of ``ds`` + must be either scalars or :class:`np.ndarray`, and have to be consistent in shapes. + batch_size(int): batch size + use_list (bool): if True, each component will contain a list + of datapoints instead of an numpy array of an extra dimension. + """ + self.ds = ds + self.batch_size = int(batch_size) + self.use_list = use_list + + def get_data(self): + """ + Yields: + Batched data by stacking each component on an extra 0th dimension. + """ + holder = [] + for data in self.ds.get_data(): + holder.append(data) + if len(holder) == self.batch_size: + yield BatchData._aggregate_batch(holder, self.use_list) + del holder[:] + + @staticmethod + def _aggregate_batch(data_holder, use_list=False): + size = len(data_holder[0]) + result = [] + for k in range(size): + if use_list: + result.append( + [x[k] for x in data_holder]) + else: + dt = data_holder[0][k] + if type(dt) in [int, bool]: + tp = 'int32' + elif type(dt) == float: + tp = 'float32' + else: + try: + tp = dt.dtype + except AttributeError: + raise TypeError("Unsupported type to batch: {}".format(type(dt))) + try: + result.append( + np.asarray([x[k] for x in data_holder], dtype=tp)) + except Exception as e: # noqa + logger.exception("Cannot batch data. Perhaps they are of inconsistent shape?") + if isinstance(dt, np.ndarray): + s = pprint.pformat([x[k].shape for x in data_holder]) + logger.error("Shape of all arrays to be batched: " + s) + try: + # open an ipython shell if possible + import IPython as IP; IP.embed() # noqa + except ImportError: + pass + return result + + def reset_state(self): + self.ds.reset_state() + + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/dpflow.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/dpflow.py new file mode 100644 index 000000000..3ec353b38 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/dpflow.py @@ -0,0 +1,40 @@ +from npu_bridge.npu_init import * +import zmq +import multiprocessing as mp +from .serialize import loads, dumps + +def data_sender(id, name, func_iter, *args): + context = zmq.Context() + sender = context.socket(zmq.PUSH) + sender.connect('ipc://@{}'.format(name)) + + print('start data provider {}-{}'.format(name, id)) + while True: + data_iter = func_iter(id, *args) + for msg in data_iter: + # print(id) + sender.send( dumps([id, msg]) ) + +def provider(nr_proc, name, func_iter, *args): + proc_ids = [i for i in range(nr_proc)] + + procs = [] + for i in range(nr_proc): + w = mp.Process(target=data_sender, args=(proc_ids[i], name, func_iter, *args)) + w.deamon = True + procs.append( w ) + + for p in procs: + p.start() + +def receiver(name): + context = zmq.Context() + + receiver = context.socket(zmq.PULL) + receiver.bind('ipc://@{}'.format(name)) + + while True: + id, msg = loads( receiver.recv() ) + # print(id, end='') + yield msg + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/logger.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/logger.py new file mode 100644 index 000000000..1c770e52e --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/logger.py @@ -0,0 +1,51 @@ +from npu_bridge.npu_init import * +import logging +import os + +OK = '\033[92m' +WARNING = '\033[93m' +FAIL = '\033[91m' +END = '\033[0m' + +PINK = '\033[95m' +BLUE = '\033[94m' +GREEN = OK +RED = FAIL +WHITE = END +YELLOW = WARNING + +class colorlogger(): + def __init__(self, log_dir, log_name='train_logs.txt'): + # set log + self._logger = logging.getLogger(log_name) + self._logger.setLevel(logging.INFO) + log_file = os.path.join(log_dir, log_name) + if not os.path.exists(log_dir): + os.makedirs(log_dir) + file_log = logging.FileHandler(log_file, mode='a') + file_log.setLevel(logging.INFO) + console_log = logging.StreamHandler() + console_log.setLevel(logging.INFO) + formatter = logging.Formatter( + "{}%(asctime)s{} %(message)s".format(GREEN, END), + "%m-%d %H:%M:%S") + file_log.setFormatter(formatter) + console_log.setFormatter(formatter) + self._logger.addHandler(file_log) + self._logger.addHandler(console_log) + + def debug(self, msg): + self._logger.debug(str(msg)) + + def info(self, msg): + self._logger.info(str(msg)) + + def warning(self, msg): + self._logger.warning(WARNING + 'WRN: ' + str(msg) + END) + + def critical(self, msg): + self._logger.critical(RED + 'CRI: ' + str(msg) + END) + + def error(self, msg): + self._logger.error(RED + 'ERR: ' + str(msg) + END) + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/mp_utils.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/mp_utils.py new file mode 100644 index 000000000..9a78e05ac --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/mp_utils.py @@ -0,0 +1,135 @@ +from npu_bridge.npu_init import * +import multiprocessing as mp +import numpy as np + +from .serialize import loads, dumps +from .serialize import dump_pkl, load_pkl +from .utils import del_file + + +mp.set_start_method('forkserver', force=True) + + +# reduce_method +LIST = 0 +ITEM = 1 +ITEMS = 2 +ITEMSLIST = 3 + +# func type +FUNC = 0 +# ITER = 1 + +# dump & load +QUEUE = 0 +PICKLE = 1 + + +class Worker(mp.Process): + def __init__(self, id, queue, func, func_type, dump_method=PICKLE, *args, **kwargs): + super(Worker, self).__init__() + self.id = id + self._func = func + self._queue = queue + self.args = args + self.kwargs = kwargs + self._func_type = func_type + self._dump_method = dump_method + + def run(self): + msg = self._func(self.id, *self.args, **self.kwargs) + if self._dump_method == QUEUE: + if self._func_type == FUNC: + self._queue.put(dumps([self.id, msg])) + # elif self._func_type == ITER: + # for i, msg in enumerate(func(self.id, *self.args, **self.kwargs)): + # self._queue.put([self.id, i, dumps(msg)]) + else: + raise ValueError('Invalid func type.') + else: + assert self._func_type == FUNC, 'dump by pickle supports only function that is executed one time.' + dump_pkl('tmp_result_{}'.format(self.id), [self.id, msg]) + print('dump to temp_file: {}'.format('tmp_result_{}'.format(self.id))) + + +class MultiProc(object): + def __init__(self, nr_proc, func, func_type=FUNC, reduce_method=LIST, dump_method=PICKLE, *args, **kwargs): + self._queue = mp.Queue() + self.nr_proc = nr_proc + self._proc_ids = [i for i in range(self.nr_proc)] + self._func_type = func_type + self._reduce_method = reduce_method + self._dump_method = dump_method + + self._procs = [] + for i in range(self.nr_proc): + w = Worker(self._proc_ids[i], self._queue, func, func_type, dump_method=self._dump_method, *args, **kwargs) + w.run() # 添加 + w.deamon = True + self._procs.append(w) + + def work(self): + for p in self._procs: + p.start() + + ret = [[] for i in range(self.nr_proc)] + for i in range(self.nr_proc): + if self._dump_method == QUEUE: + id, msg = loads(self._queue.get(block=True, timeout=None)) + ret[id] = msg + elif self._dump_method == PICKLE: + pass + else: + raise ValueError('Invalid dump method') + + for p in self._procs: + p.join() + + if self._dump_method == PICKLE: + for i in range(self.nr_proc): + id, msg = load_pkl('tmp_result_{}'.format(self._proc_ids[i])) + ret[id] = msg + del_file('tmp_result_{}.pkl'.format(self._proc_ids[i])) + + result = [] + if self._reduce_method == LIST: + for i in range(len(ret)): + result.extend(ret[i]) + elif self._reduce_method == ITEM: + result = ret + elif self._reduce_method == ITEMS: + for i in range(len(ret[0])): + result.append([ret[j][i] for j in range(len(ret))]) + elif self._reduce_method == ITEMSLIST: + for i in range(len(ret[0])): + tmp_res = [] + for j in range(len(ret)): + tmp_res.extend(ret[j][i]) + result.append(tmp_res) + else: + raise ValueError('Invalid reduce method.') + + return result + + +if __name__ == '__main__': + (npu_sess, npu_shutdown) = init_resource() + test_ranges = [0, 100, 200, 300, 400, 500] + + + def test_net(id): + test_range = [test_ranges[id], test_ranges[id + 1]] + x = [] + for i in range(*test_range): + x.append(np.ones((10, 10)) * i) + print('finish {}'.format(id)) + return x + + + x = MultiProc(5, test_net, reduce_method=LIST) + res = x.work() + from IPython import embed; + + embed() + shutdown_resource(npu_sess, npu_shutdown) + close_session(npu_sess) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/mp_utils_my.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/mp_utils_my.py new file mode 100644 index 000000000..d8257ca03 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/mp_utils_my.py @@ -0,0 +1,135 @@ +from npu_bridge.npu_init import * +import multiprocessing as mp +import numpy as np + +from .serialize import loads, dumps +from .serialize import dump_pkl, load_pkl +from .utils import del_file + + +mp.set_start_method('forkserver', force=True) + + +# reduce_method +LIST = 0 +ITEM = 1 +ITEMS = 2 +ITEMSLIST = 3 + +# func type +FUNC = 0 +# ITER = 1 + +# dump & load +# QUEUE = 0 +PICKLE = 1 + + +class Worker(mp.Process): + def __init__(self, id, func, func_type, dump_method=PICKLE, *args, **kwargs): + super(Worker, self).__init__() + self.id = id + self._func = func + # self._queue = queue + self.args = args + self.kwargs = kwargs + self._func_type = func_type + self._dump_method = dump_method + + def run(self): + msg = self._func(self.id, *self.args, **self.kwargs) + # if self._dump_method == QUEUE: + # if self._func_type == FUNC: + # self._queue.put(dumps([self.id, msg])) + # # elif self._func_type == ITER: + # # for i, msg in enumerate(func(self.id, *self.args, **self.kwargs)): + # # self._queue.put([self.id, i, dumps(msg)]) + # else: + # raise ValueError('Invalid func type.') + # else: + assert self._func_type == FUNC, 'dump by pickle supports only function that is executed one time.' + dump_pkl('tmp_result_{}'.format(self.id), [self.id, msg]) + print('dump to temp_file: {}'.format('tmp_result_{}'.format(self.id))) + + +class MultiProc(object): + def __init__(self, nr_proc, func, func_type=FUNC, reduce_method=LIST, dump_method=PICKLE, *args, **kwargs): + # self._queue = mp.Queue() + self.nr_proc = nr_proc + self._proc_ids = [i for i in range(self.nr_proc)] + self._func_type = func_type + self._reduce_method = reduce_method + self._dump_method = dump_method + + self._procs = [] + for i in range(self.nr_proc): + w = Worker(self._proc_ids[i], func, func_type, dump_method=self._dump_method, *args, **kwargs) + w.run() # 添加 + w.deamon = True + self._procs.append(w) + + def work(self): + for p in self._procs: + p.start() + + ret = [[] for i in range(self.nr_proc)] + for i in range(self.nr_proc): + # if self._dump_method == QUEUE: + # id, msg = loads(self._queue.get(block=True, timeout=None)) + # ret[id] = msg + if self._dump_method == PICKLE: + pass + else: + raise ValueError('Invalid dump method') + + for p in self._procs: + p.join() + + if self._dump_method == PICKLE: + for i in range(self.nr_proc): + id, msg = load_pkl('tmp_result_{}'.format(self._proc_ids[i])) + ret[id] = msg + del_file('tmp_result_{}.pkl'.format(self._proc_ids[i])) + + result = [] + if self._reduce_method == LIST: + for i in range(len(ret)): + result.extend(ret[i]) + elif self._reduce_method == ITEM: + result = ret + elif self._reduce_method == ITEMS: + for i in range(len(ret[0])): + result.append([ret[j][i] for j in range(len(ret))]) + elif self._reduce_method == ITEMSLIST: + for i in range(len(ret[0])): + tmp_res = [] + for j in range(len(ret)): + tmp_res.extend(ret[j][i]) + result.append(tmp_res) + else: + raise ValueError('Invalid reduce method.') + + return result + + +if __name__ == '__main__': + (npu_sess, npu_shutdown) = init_resource() + test_ranges = [0, 100, 200, 300, 400, 500] + + + def test_net(id): + test_range = [test_ranges[id], test_ranges[id + 1]] + x = [] + for i in range(*test_range): + x.append(np.ones((10, 10)) * i) + print('finish {}'.format(id)) + return x + + + x = MultiProc(5, test_net, reduce_method=LIST) + res = x.work() + from IPython import embed; + + embed() + shutdown_resource(npu_sess, npu_shutdown) + close_session(npu_sess) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/net_utils.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/net_utils.py new file mode 100644 index 000000000..0d516ea65 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/net_utils.py @@ -0,0 +1,120 @@ +from npu_bridge.npu_init import * +import tensorflow as tf +from collections import namedtuple + +def average_gradients(tower_grads): + """Calculate the average gradient for each shared variable across all towers. + Note that this function provides a synchronization point across all towers. + Args: + tower_grads: List of lists of (gradient, variable) tuples. The outer list + is over individual gradients. The inner list is over the gradient + calculation for each tower. + Returns: + List of pairs of (gradient, variable) where the gradient has been averaged + across all towers. + """ + average_grads = [] + for grad_and_vars in zip(*tower_grads): + if grad_and_vars[0][0] is None: + print('No gradient on var {}'.format(grad_and_vars[0][1].name)) + continue + # Note that each grad_and_vars looks like the following: + # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) + grads = [] + for g, _ in grad_and_vars: + # Add 0 dimension to the gradients to represent the tower. + expanded_g = tf.expand_dims(g, 0) + + # Append on a 'tower' dimension which we will average over below. + grads.append(expanded_g) + + # Average over the 'tower' dimension. + grad = tf.concat(axis=0, values=grads) + grad = tf.reduce_mean(grad, 0) + + # Keep in mind that the Variables are redundant because they are shared + # across towers. So .. we will just return the first tower's pointer to + # the Variable. + v = grad_and_vars[0][1] + grad_and_var = (grad, v) + average_grads.append(grad_and_var) + return average_grads + +def sum_gradients(tower_grads): + """Calculate the sum gradient for each shared variable across all towers. + Note that this function provides a synchronization point across all towers. + Args: + tower_grads: List of lists of (gradient, variable) tuples. The outer list + is over individual gradients. The inner list is over the gradient + calculation for each tower. + Returns: + List of pairs of (gradient, variable) where the gradient has been averaged + across all towers. + """ + sum_grads = [] + for grad_and_vars in zip(*tower_grads): + if grad_and_vars[0][0] is None: + print('No gradient on var {}'.format(grad_and_vars[0][1].name)) + continue + # Note that each grad_and_vars looks like the following: + # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) + grads = [] + for g, _ in grad_and_vars: + # Add 0 dimension to the gradients to represent the tower. + if g is not None: + expanded_g = tf.expand_dims(g, 0) + + # Append on a 'tower' dimension which we will average over below. + grads.append(expanded_g) + + # Average over the 'tower' dimension. + grad = tf.concat(axis=0, values=grads) + grad = tf.reduce_sum(grad, 0) + + # Keep in mind that the Variables are redundant because they are shared + # across towers. So .. we will just return the first tower's pointer to + # the Variable. + v = grad_and_vars[0][1] + grad_and_var = (grad, v) + sum_grads.append(grad_and_var) + return sum_grads + +def aggregate_batch(data_holder): + results = [] + if len(data_holder) == 1: + results = data_holder if isinstance(data_holder[0], tf.Tensor) else data_holder[0] + elif isinstance(data_holder[0], tf.Tensor): + results.append( tf.concat(data_holder, axis=0) ) + else: + for i in range(len(data_holder[0])): + results.append( + tf.concat([data_holder[j][i] for j in range(len(data_holder))], axis=0)) + return results + +def get_optimizer(lr, optimizer='momentum'): + if optimizer == 'sgd': + optimizer = tf.train.GradientDescentOptimizer(lr) + elif optimizer == 'momentum': + optimizer = tf.train.MomentumOptimizer(lr, 0.9) + elif optimizer == 'adam': + optimizer = tf.train.AdamOptimizer(lr) + else: + raise ValueError('invalid optimizer') + return optimizer + +def get_tower_summary_dict(summary): + ret = dict() + for v, method in summary: + if len(tf.get_collection(v)) == 1: + ret[v] = tf.get_collection(v)[0] + elif len(tf.get_collection(v)) > 1: + if method == 'mean': + ret[v] = tf.reduce_mean(tf.get_collection(v), axis=0) + elif method == 'sum': + ret[v] = tf.reduce_sum(tf.get_collection(v), axis=0) + elif method == 'concat': + ret[v] = tf.concat(tf.get_collection(v), axis=0) + else: + raise ValueError('Invalid summary reduced method: {}'.format(method)) + return ret + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/saver.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/saver.py new file mode 100644 index 000000000..ec5cd96e0 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/saver.py @@ -0,0 +1,69 @@ +from npu_bridge.npu_init import * +import tensorflow as tf +from tensorflow.python import pywrap_tensorflow +import numpy as np +from config import cfg + +import os +import os.path as osp + +def get_variables_in_checkpoint_file(file_name): + try: + reader = pywrap_tensorflow.NewCheckpointReader(file_name) + var_to_shape_map = reader.get_variable_to_shape_map() + return reader, var_to_shape_map + except Exception as e: # pylint: disable=broad-except + print(str(e)) + if "corrupted compressed block contents" in str(e): + print( + "It's likely that your checkpoint file has been compressed " + "with SNAPPY.") + +class Saver(object): + def __init__(self, sess, var_list, model_dump_dir, name_prefix='snapshot'): + self.sess = sess + self.var_list = var_list + self.model_dump_dir = model_dump_dir + self._name_prefix = name_prefix + + self.saver = tf.train.Saver(var_list=var_list, max_to_keep=100000) + + def save_model(self, iter): + filename = '{}_{:d}'.format(self._name_prefix, iter) + '.ckpt' + if not os.path.exists(self.model_dump_dir): + os.makedirs(self.model_dump_dir) + filename = os.path.join(self.model_dump_dir, filename) + self.saver.save(self.sess, filename) + print('Wrote snapshot to: {:s}'.format(filename)) + +def load_model(sess, model_path): + #TODO(global variables ?? how about _adam weights) + variables = tf.global_variables() + reader, var_keep_dic = get_variables_in_checkpoint_file(model_path) + if 'global_step' in var_keep_dic: + var_keep_dic.pop('global_step') + + # vis_var_keep_dic = [] + variables_to_restore = {} + changed_variables = {} + for v in variables: + + v_name = v.name.split(':')[0] + if v_name in var_keep_dic: + # print('Varibles restored: %s' % v.name) + #variables_to_restore.append(v) + variables_to_restore[v_name] = v + # vis_var_keep_dic.append(v.name.split(':')[0]) + else: + # print('Unrestored Variables: %s' % v.name) + pass + # print('Extra Variables in ckpt', set(var_keep_dic) - set(vis_var_keep_dic)) + + if len(variables_to_restore) > 0: + restorer = tf.train.Saver(variables_to_restore) + restorer.restore(sess, model_path) + + else: + print('No variables in {} fits the network'.format(model_path)) + + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/serialize.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/serialize.py new file mode 100644 index 000000000..3cf9ed5bc --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/serialize.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +### modified from https://github.com/ppwwyyxx/tensorpack + +from npu_bridge.npu_init import * +import os +import sys +import msgpack +import msgpack_numpy +msgpack_numpy.patch() + +# https://github.com/apache/arrow/pull/1223#issuecomment-359895666 +old_mod = sys.modules.get('torch', None) +sys.modules['torch'] = None +try: + import pyarrow as pa +except ImportError: + pa = None +if old_mod is not None: + sys.modules['torch'] = old_mod +else: + del sys.modules['torch'] + +import pickle + +__all__ = ['loads', 'dumps', 'dump_pkl', 'load_pkl'] + + +def dumps_msgpack(obj): + """ + Serialize an object. + Returns: + Implementation-dependent bytes-like object + """ + return msgpack.dumps(obj, use_bin_type=True) + + +def loads_msgpack(buf): + """ + Args: + buf: the output of `dumps`. + """ + return msgpack.loads(buf, raw=False) + + +def dumps_pyarrow(obj): + """ + Serialize an object. + + Returns: + Implementation-dependent bytes-like object + """ + return pa.serialize(obj).to_buffer() + + +def loads_pyarrow(buf): + """ + Args: + buf: the output of `dumps`. + """ + return pa.deserialize(buf) + + +def dump_pkl(name, obj): + with open('{}.pkl'.format(name), 'wb') as f: + pickle.dump( obj, f, pickle.HIGHEST_PROTOCOL ) + +def load_pkl(name): + with open('{}.pkl'.format(name), 'rb') as f: + ret = pickle.load( f ) + return ret + +if pa is None: + loads = loads_msgpack + dumps = dumps_msgpack +else: + loads = loads_pyarrow + dumps = dumps_pyarrow + + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/timer.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/timer.py new file mode 100644 index 000000000..1b2ebaff0 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/timer.py @@ -0,0 +1,40 @@ +# -------------------------------------------------------- +# Fast R-CNN +# Copyright (c) 2015 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Written by Ross Girshick +# -------------------------------------------------------- + +from npu_bridge.npu_init import * +import time + +class Timer(object): + """A simple timer.""" + def __init__(self): + self.total_time = 0. + self.calls = 0 + self.start_time = 0. + self.diff = 0. + self.average_time = 0. + self.warm_up = 0 + + def tic(self): + # using time.time instead of time.clock because time time.clock + # does not normalize for multithreading + self.start_time = time.time() + + def toc(self, average=True): + self.diff = time.time() - self.start_time + if self.warm_up < 10: + self.warm_up += 1 + return self.diff + else: + self.total_time += self.diff + self.calls += 1 + self.average_time = self.total_time / self.calls + + if average: + return self.average_time + else: + return self.diff + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/utils.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/utils.py new file mode 100644 index 000000000..93d5bda19 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/tfflat/utils.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +from npu_bridge.npu_init import * +import os +import sys +import numpy as np +from datetime import datetime + +def mem_info(): + import subprocess + dev = subprocess.check_output( + "nvidia-smi | grep MiB | awk -F '|' '{print $3}' | awk -F '/' '{print $1}' | grep -Eo '[0-9]{1,10}'", + shell=True) + dev = dev.decode() + dev_mem = list(map(lambda x: int(x), dev.split('\n')[:-1])) + return dev_mem + +def add_pypath(path): + if path not in sys.path: + sys.path.insert(0, path) + +def make_link(dest_path, link_path): + if os.path.islink(link_path): + os.system('rm {}'.format(link_path)) + os.system('ln -s {} {}'.format(dest_path, link_path)) + +def make_dir(path): + if os.path.exists(path) or os.path.islink(path): + return + os.makedirs(path) + +def del_file(path, msg='{} deleted.'): + if os.path.exists(path): + os.remove(path) + print(msg.format(path)) + +def approx_equal(a, b, eps=1e-9): + return np.fabs(a-b) < eps + +def get_rng(obj=None): + """ + Get a good RNG seeded with time, pid and the object. + + Args: + obj: some object to use to generate random seed. + Returns: + np.random.RandomState: the RNG. + """ + seed = (id(obj) + os.getpid() + + int(datetime.now().strftime("%Y%m%d%H%M%S%f"))) % 4294967295 + return np.random.RandomState(seed) + + -- Gitee From cc4d4ccd593e2dae015a339fe02ece84c1e8701c Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:49:57 +0000 Subject: [PATCH 24/59] first commit --- .../src/lib/utils/__init__.py | 3 + .../src/lib/utils/bbox.c | 8258 +++++++++++++++++ .../src/lib/utils/bbox.pyx | 144 + .../src/lib/utils/blob.py | 49 + .../src/lib/utils/boxes_grid.py | 75 + .../src/lib/utils/mask.py | 42 + .../src/lib/utils/timer.py | 40 + 7 files changed, 8611 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/__init__.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/bbox.c create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/bbox.pyx create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/blob.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/boxes_grid.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/mask.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/timer.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/__init__.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/__init__.py new file mode 100644 index 000000000..faaaf799c --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/bbox.c b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/bbox.c new file mode 100644 index 000000000..dcfb03cd4 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/bbox.c @@ -0,0 +1,8258 @@ +/* Generated by Cython 0.23.4 */ + +#define PY_SSIZE_T_CLEAN +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000) + #error Cython requires Python 2.6+ or Python 3.2+. +#else +#define CYTHON_ABI "0_23_4" +#include +#ifndef offsetof +#define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION +#define CYTHON_COMPILING_IN_PYPY 1 +#define CYTHON_COMPILING_IN_CPYTHON 0 +#else +#define CYTHON_COMPILING_IN_PYPY 0 +#define CYTHON_COMPILING_IN_CPYTHON 1 +#endif +#if !defined(CYTHON_USE_PYLONG_INTERNALS) && CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000 +#define CYTHON_USE_PYLONG_INTERNALS 1 +#endif +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) +#define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) +#else + #define CYTHON_PEP393_ENABLED 0 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if PY_VERSION_HEX >= 0x030500B1 +#define __Pyx_PyAsyncMethodsStruct PyAsyncMethods +#define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) +#elif CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3 +typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; +} __Pyx_PyAsyncMethodsStruct; +#define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) +#else +#define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) + +#ifndef CYTHON_INLINE + #if defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif + + +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__utils__cython_bbox +#define __PYX_HAVE_API__utils__cython_bbox +#include "string.h" +#include "stdio.h" +#include "stdlib.h" +#include "numpy/arrayobject.h" +#include "numpy/ufuncobject.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#ifdef PYREX_WITHOUT_ASSERTIONS +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) && defined (_M_X64) + #define __Pyx_sst_abs(value) _abs64(value) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyObject_AsSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +#if PY_MAJOR_VERSION < 3 +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) +{ + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#else +#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen +#endif +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_COMPILING_IN_CPYTHON +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ + +static PyObject *__pyx_m; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + +#if !defined(CYTHON_CCOMPLEX) + #if defined(__cplusplus) + #define CYTHON_CCOMPLEX 1 + #elif defined(_Complex_I) + #define CYTHON_CCOMPLEX 1 + #else + #define CYTHON_CCOMPLEX 0 + #endif +#endif +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #include + #else + #include + #endif +#endif +#if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) + #undef _Complex_I + #define _Complex_I 1.0fj +#endif + + +static const char *__pyx_f[] = { + "pu/lib/utils/bbox.pyx", + "__init__.pxd", + "type.pxd", +}; +#define IS_UNSIGNED(type) (((type) -1) > 0) +struct __Pyx_StructField_; +#define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) +typedef struct { + const char* name; + struct __Pyx_StructField_* fields; + size_t size; + size_t arraysize[8]; + int ndim; + char typegroup; + char is_unsigned; + int flags; +} __Pyx_TypeInfo; +typedef struct __Pyx_StructField_ { + __Pyx_TypeInfo* type; + const char* name; + size_t offset; +} __Pyx_StructField; +typedef struct { + __Pyx_StructField* field; + size_t parent_offset; +} __Pyx_BufFmt_StackElem; +typedef struct { + __Pyx_StructField root; + __Pyx_BufFmt_StackElem* head; + size_t fmt_offset; + size_t new_count, enc_count; + size_t struct_alignment; + int is_complex; + char enc_type; + char new_packmode; + char enc_packmode; + char is_valid_array; +} __Pyx_BufFmt_Context; + + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":725 + * # in Cython to enable them only on the right systems. + * + * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + */ +typedef npy_int8 __pyx_t_5numpy_int8_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":726 + * + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t + */ +typedef npy_int16 __pyx_t_5numpy_int16_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":727 + * ctypedef npy_int8 int8_t + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< + * ctypedef npy_int64 int64_t + * #ctypedef npy_int96 int96_t + */ +typedef npy_int32 __pyx_t_5numpy_int32_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":728 + * ctypedef npy_int16 int16_t + * ctypedef npy_int32 int32_t + * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< + * #ctypedef npy_int96 int96_t + * #ctypedef npy_int128 int128_t + */ +typedef npy_int64 __pyx_t_5numpy_int64_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":732 + * #ctypedef npy_int128 int128_t + * + * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + */ +typedef npy_uint8 __pyx_t_5numpy_uint8_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":733 + * + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t + */ +typedef npy_uint16 __pyx_t_5numpy_uint16_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":734 + * ctypedef npy_uint8 uint8_t + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< + * ctypedef npy_uint64 uint64_t + * #ctypedef npy_uint96 uint96_t + */ +typedef npy_uint32 __pyx_t_5numpy_uint32_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":735 + * ctypedef npy_uint16 uint16_t + * ctypedef npy_uint32 uint32_t + * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< + * #ctypedef npy_uint96 uint96_t + * #ctypedef npy_uint128 uint128_t + */ +typedef npy_uint64 __pyx_t_5numpy_uint64_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":739 + * #ctypedef npy_uint128 uint128_t + * + * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< + * ctypedef npy_float64 float64_t + * #ctypedef npy_float80 float80_t + */ +typedef npy_float32 __pyx_t_5numpy_float32_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":740 + * + * ctypedef npy_float32 float32_t + * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< + * #ctypedef npy_float80 float80_t + * #ctypedef npy_float128 float128_t + */ +typedef npy_float64 __pyx_t_5numpy_float64_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":749 + * # The int types are mapped a bit surprising -- + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t + */ +typedef npy_long __pyx_t_5numpy_int_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":750 + * # numpy.int corresponds to 'l' and numpy.long to 'q' + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< + * ctypedef npy_longlong longlong_t + * + */ +typedef npy_longlong __pyx_t_5numpy_long_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":751 + * ctypedef npy_long int_t + * ctypedef npy_longlong long_t + * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_ulong uint_t + */ +typedef npy_longlong __pyx_t_5numpy_longlong_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":753 + * ctypedef npy_longlong longlong_t + * + * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t + */ +typedef npy_ulong __pyx_t_5numpy_uint_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":754 + * + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< + * ctypedef npy_ulonglong ulonglong_t + * + */ +typedef npy_ulonglong __pyx_t_5numpy_ulong_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":755 + * ctypedef npy_ulong uint_t + * ctypedef npy_ulonglong ulong_t + * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< + * + * ctypedef npy_intp intp_t + */ +typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":757 + * ctypedef npy_ulonglong ulonglong_t + * + * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< + * ctypedef npy_uintp uintp_t + * + */ +typedef npy_intp __pyx_t_5numpy_intp_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":758 + * + * ctypedef npy_intp intp_t + * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< + * + * ctypedef npy_double float_t + */ +typedef npy_uintp __pyx_t_5numpy_uintp_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":760 + * ctypedef npy_uintp uintp_t + * + * ctypedef npy_double float_t # <<<<<<<<<<<<<< + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t + */ +typedef npy_double __pyx_t_5numpy_float_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":761 + * + * ctypedef npy_double float_t + * ctypedef npy_double double_t # <<<<<<<<<<<<<< + * ctypedef npy_longdouble longdouble_t + * + */ +typedef npy_double __pyx_t_5numpy_double_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":762 + * ctypedef npy_double float_t + * ctypedef npy_double double_t + * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cfloat cfloat_t + */ +typedef npy_longdouble __pyx_t_5numpy_longdouble_t; + +/* "utils/bbox.pyx":13 + * + * DTYPE = np.float + * ctypedef np.float_t DTYPE_t # <<<<<<<<<<<<<< + * + * def bbox_overlaps_float( + */ +typedef __pyx_t_5numpy_float_t __pyx_t_5utils_11cython_bbox_DTYPE_t; +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< float > __pyx_t_float_complex; + #else + typedef float _Complex __pyx_t_float_complex; + #endif +#else + typedef struct { float real, imag; } __pyx_t_float_complex; +#endif + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + typedef ::std::complex< double > __pyx_t_double_complex; + #else + typedef double _Complex __pyx_t_double_complex; + #endif +#else + typedef struct { double real, imag; } __pyx_t_double_complex; +#endif + + +/*--- Type declarations ---*/ + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":764 + * ctypedef npy_longdouble longdouble_t + * + * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t + */ +typedef npy_cfloat __pyx_t_5numpy_cfloat_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":765 + * + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< + * ctypedef npy_clongdouble clongdouble_t + * + */ +typedef npy_cdouble __pyx_t_5numpy_cdouble_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":766 + * ctypedef npy_cfloat cfloat_t + * ctypedef npy_cdouble cdouble_t + * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< + * + * ctypedef npy_cdouble complex_t + */ +typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":768 + * ctypedef npy_clongdouble clongdouble_t + * + * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew1(a): + */ +typedef npy_cdouble __pyx_t_5numpy_complex_t; + +/* --- Runtime support code (head) --- */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, + const char *name, int exact); + +static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, + __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); + +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); + +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +static void __Pyx_RaiseBufferIndexError(int axis); + +#define __Pyx_BufPtrStrided2d(type, buf, i0, s0, i1, s1) (type)((char*)buf + i0 * s0 + i1 * s1) +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); + +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) + PyErr_SetObject(PyExc_KeyError, args); + Py_XDECREF(args); + } + return NULL; + } + Py_INCREF(value); + return value; +} +#else + #define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#endif + +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +typedef struct { + int code_line; + PyCodeObject* code_object; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +typedef struct { + Py_ssize_t shape, strides, suboffsets; +} __Pyx_Buf_DimInfo; +typedef struct { + size_t refcount; + Py_buffer pybuffer; +} __Pyx_Buffer; +typedef struct { + __Pyx_Buffer *rcbuffer; + char *data; + __Pyx_Buf_DimInfo diminfo[8]; +} __Pyx_LocalBuf_ND; + +#if PY_MAJOR_VERSION < 3 + static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); + static void __Pyx_ReleaseBuffer(Py_buffer *view); +#else + #define __Pyx_GetBuffer PyObject_GetBuffer + #define __Pyx_ReleaseBuffer PyBuffer_Release +#endif + + +static Py_ssize_t __Pyx_zeros[] = {0, 0, 0, 0, 0, 0, 0, 0}; +static Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1}; + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value); + +static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *); + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + #define __Pyx_CREAL(z) ((z).real()) + #define __Pyx_CIMAG(z) ((z).imag()) + #else + #define __Pyx_CREAL(z) (__real__(z)) + #define __Pyx_CIMAG(z) (__imag__(z)) + #endif +#else + #define __Pyx_CREAL(z) ((z).real) + #define __Pyx_CIMAG(z) ((z).imag) +#endif +#if (defined(_WIN32) || defined(__clang__)) && defined(__cplusplus) && CYTHON_CCOMPLEX + #define __Pyx_SET_CREAL(z,x) ((z).real(x)) + #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) +#else + #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) + #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) +#endif + +static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); + +#if CYTHON_CCOMPLEX + #define __Pyx_c_eqf(a, b) ((a)==(b)) + #define __Pyx_c_sumf(a, b) ((a)+(b)) + #define __Pyx_c_difff(a, b) ((a)-(b)) + #define __Pyx_c_prodf(a, b) ((a)*(b)) + #define __Pyx_c_quotf(a, b) ((a)/(b)) + #define __Pyx_c_negf(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zerof(z) ((z)==(float)0) + #define __Pyx_c_conjf(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_absf(z) (::std::abs(z)) + #define __Pyx_c_powf(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zerof(z) ((z)==0) + #define __Pyx_c_conjf(z) (conjf(z)) + #if 1 + #define __Pyx_c_absf(z) (cabsf(z)) + #define __Pyx_c_powf(a, b) (cpowf(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex); + static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex); + #if 1 + static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex); + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex); + #endif +#endif + +static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); + +#if CYTHON_CCOMPLEX + #define __Pyx_c_eq(a, b) ((a)==(b)) + #define __Pyx_c_sum(a, b) ((a)+(b)) + #define __Pyx_c_diff(a, b) ((a)-(b)) + #define __Pyx_c_prod(a, b) ((a)*(b)) + #define __Pyx_c_quot(a, b) ((a)/(b)) + #define __Pyx_c_neg(a) (-(a)) + #ifdef __cplusplus + #define __Pyx_c_is_zero(z) ((z)==(double)0) + #define __Pyx_c_conj(z) (::std::conj(z)) + #if 1 + #define __Pyx_c_abs(z) (::std::abs(z)) + #define __Pyx_c_pow(a, b) (::std::pow(a, b)) + #endif + #else + #define __Pyx_c_is_zero(z) ((z)==0) + #define __Pyx_c_conj(z) (conj(z)) + #if 1 + #define __Pyx_c_abs(z) (cabs(z)) + #define __Pyx_c_pow(a, b) (cpow(a, b)) + #endif + #endif +#else + static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex); + static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex); + #if 1 + static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex); + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex); + #endif +#endif + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value); + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +static int __Pyx_check_binary_version(void); + +#if !defined(__Pyx_PyIdentifier_FromString) +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) +#else + #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) +#endif +#endif + +static PyObject *__Pyx_ImportModule(const char *name); + +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); + +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + + +/* Module declarations from 'cython' */ + +/* Module declarations from 'cpython.buffer' */ + +/* Module declarations from 'libc.string' */ + +/* Module declarations from 'libc.stdio' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.type' */ +static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; + +/* Module declarations from 'cpython' */ + +/* Module declarations from 'cpython.object' */ + +/* Module declarations from 'cpython.ref' */ + +/* Module declarations from 'libc.stdlib' */ + +/* Module declarations from 'numpy' */ + +/* Module declarations from 'numpy' */ +static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; +static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; +static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; +static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; +static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ + +/* Module declarations from 'utils.cython_bbox' */ +static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_5utils_11cython_bbox_DTYPE_t = { "DTYPE_t", NULL, sizeof(__pyx_t_5utils_11cython_bbox_DTYPE_t), { 0 }, 0, 'R', 0, 0 }; +#define __Pyx_MODULE_NAME "utils.cython_bbox" +int __pyx_module_is_main_utils__cython_bbox = 0; + +/* Implementation of 'utils.cython_bbox' */ +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_ValueError; +static PyObject *__pyx_builtin_RuntimeError; +static char __pyx_k_B[] = "B"; +static char __pyx_k_H[] = "H"; +static char __pyx_k_I[] = "I"; +static char __pyx_k_K[] = "K"; +static char __pyx_k_L[] = "L"; +static char __pyx_k_N[] = "N"; +static char __pyx_k_O[] = "O"; +static char __pyx_k_Q[] = "Q"; +static char __pyx_k_b[] = "b"; +static char __pyx_k_d[] = "d"; +static char __pyx_k_f[] = "f"; +static char __pyx_k_g[] = "g"; +static char __pyx_k_h[] = "h"; +static char __pyx_k_i[] = "i"; +static char __pyx_k_k[] = "k"; +static char __pyx_k_l[] = "l"; +static char __pyx_k_n[] = "n"; +static char __pyx_k_q[] = "q"; +static char __pyx_k_Zd[] = "Zd"; +static char __pyx_k_Zf[] = "Zf"; +static char __pyx_k_Zg[] = "Zg"; +static char __pyx_k_ih[] = "ih"; +static char __pyx_k_iw[] = "iw"; +static char __pyx_k_np[] = "np"; +static char __pyx_k_ua[] = "ua"; +static char __pyx_k_main[] = "__main__"; +static char __pyx_k_test[] = "__test__"; +static char __pyx_k_DTYPE[] = "DTYPE"; +static char __pyx_k_boxes[] = "boxes"; +static char __pyx_k_dtype[] = "dtype"; +static char __pyx_k_float[] = "float"; +static char __pyx_k_numpy[] = "numpy"; +static char __pyx_k_range[] = "range"; +static char __pyx_k_zeros[] = "zeros"; +static char __pyx_k_import[] = "__import__"; +static char __pyx_k_box_area[] = "box_area"; +static char __pyx_k_overlaps[] = "overlaps"; +static char __pyx_k_ValueError[] = "ValueError"; +static char __pyx_k_query_boxes[] = "query_boxes"; +static char __pyx_k_RuntimeError[] = "RuntimeError"; +static char __pyx_k_bbox_overlaps[] = "bbox_overlaps"; +static char __pyx_k_utils_cython_bbox[] = "utils.cython_bbox"; +static char __pyx_k_bbox_overlaps_self[] = "bbox_overlaps_self"; +static char __pyx_k_bbox_overlaps_float[] = "bbox_overlaps_float"; +static char __pyx_k_ndarray_is_not_C_contiguous[] = "ndarray is not C contiguous"; +static char __pyx_k_unknown_dtype_code_in_numpy_pxd[] = "unknown dtype code in numpy.pxd (%d)"; +static char __pyx_k_unsullied_sharefs_lizeming_work[] = "/unsullied/sharefs/lizeming/work_isilon/tf_works/tf-faster-rcnn-rfcn-multigpu/lib/utils/bbox.pyx"; +static char __pyx_k_Format_string_allocated_too_shor[] = "Format string allocated too short, see comment in numpy.pxd"; +static char __pyx_k_Non_native_byte_order_not_suppor[] = "Non-native byte order not supported"; +static char __pyx_k_ndarray_is_not_Fortran_contiguou[] = "ndarray is not Fortran contiguous"; +static char __pyx_k_Format_string_allocated_too_shor_2[] = "Format string allocated too short."; +static PyObject *__pyx_n_s_DTYPE; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor; +static PyObject *__pyx_kp_u_Format_string_allocated_too_shor_2; +static PyObject *__pyx_n_s_K; +static PyObject *__pyx_n_s_N; +static PyObject *__pyx_kp_u_Non_native_byte_order_not_suppor; +static PyObject *__pyx_n_s_RuntimeError; +static PyObject *__pyx_n_s_ValueError; +static PyObject *__pyx_n_s_bbox_overlaps; +static PyObject *__pyx_n_s_bbox_overlaps_float; +static PyObject *__pyx_n_s_bbox_overlaps_self; +static PyObject *__pyx_n_s_box_area; +static PyObject *__pyx_n_s_boxes; +static PyObject *__pyx_n_s_dtype; +static PyObject *__pyx_n_s_float; +static PyObject *__pyx_n_s_ih; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_n_s_iw; +static PyObject *__pyx_n_s_k; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_n; +static PyObject *__pyx_kp_u_ndarray_is_not_C_contiguous; +static PyObject *__pyx_kp_u_ndarray_is_not_Fortran_contiguou; +static PyObject *__pyx_n_s_np; +static PyObject *__pyx_n_s_numpy; +static PyObject *__pyx_n_s_overlaps; +static PyObject *__pyx_n_s_query_boxes; +static PyObject *__pyx_n_s_range; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_ua; +static PyObject *__pyx_kp_u_unknown_dtype_code_in_numpy_pxd; +static PyObject *__pyx_kp_s_unsullied_sharefs_lizeming_work; +static PyObject *__pyx_n_s_utils_cython_bbox; +static PyObject *__pyx_n_s_zeros; +static PyObject *__pyx_pf_5utils_11cython_bbox_bbox_overlaps_float(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_boxes, PyArrayObject *__pyx_v_query_boxes); /* proto */ +static PyObject *__pyx_pf_5utils_11cython_bbox_2bbox_overlaps(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_boxes, PyArrayObject *__pyx_v_query_boxes); /* proto */ +static PyObject *__pyx_pf_5utils_11cython_bbox_4bbox_overlaps_self(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_boxes, PyArrayObject *__pyx_v_query_boxes); /* proto */ +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ +static PyObject *__pyx_tuple_; +static PyObject *__pyx_tuple__2; +static PyObject *__pyx_tuple__3; +static PyObject *__pyx_tuple__4; +static PyObject *__pyx_tuple__5; +static PyObject *__pyx_tuple__6; +static PyObject *__pyx_tuple__7; +static PyObject *__pyx_tuple__9; +static PyObject *__pyx_tuple__11; +static PyObject *__pyx_codeobj__8; +static PyObject *__pyx_codeobj__10; +static PyObject *__pyx_codeobj__12; + +/* "utils/bbox.pyx":15 + * ctypedef np.float_t DTYPE_t + * + * def bbox_overlaps_float( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5utils_11cython_bbox_1bbox_overlaps_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_5utils_11cython_bbox_bbox_overlaps_float[] = "\n Parameters\n ----------\n boxes: (N, 4) ndarray of float\n query_boxes: (K, 4) ndarray of float\n Returns\n -------\n overlaps: (N, K) ndarray of overlap between boxes and query_boxes\n "; +static PyMethodDef __pyx_mdef_5utils_11cython_bbox_1bbox_overlaps_float = {"bbox_overlaps_float", (PyCFunction)__pyx_pw_5utils_11cython_bbox_1bbox_overlaps_float, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5utils_11cython_bbox_bbox_overlaps_float}; +static PyObject *__pyx_pw_5utils_11cython_bbox_1bbox_overlaps_float(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_boxes = 0; + PyArrayObject *__pyx_v_query_boxes = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("bbox_overlaps_float (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_boxes,&__pyx_n_s_query_boxes,0}; + PyObject* values[2] = {0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_boxes)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_query_boxes)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("bbox_overlaps_float", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "bbox_overlaps_float") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + } + __pyx_v_boxes = ((PyArrayObject *)values[0]); + __pyx_v_query_boxes = ((PyArrayObject *)values[1]); + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("bbox_overlaps_float", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("utils.cython_bbox.bbox_overlaps_float", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_boxes), __pyx_ptype_5numpy_ndarray, 1, "boxes", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_query_boxes), __pyx_ptype_5numpy_ndarray, 1, "query_boxes", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_5utils_11cython_bbox_bbox_overlaps_float(__pyx_self, __pyx_v_boxes, __pyx_v_query_boxes); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5utils_11cython_bbox_bbox_overlaps_float(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_boxes, PyArrayObject *__pyx_v_query_boxes) { + unsigned int __pyx_v_N; + unsigned int __pyx_v_K; + PyArrayObject *__pyx_v_overlaps = 0; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_iw; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_ih; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_box_area; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_ua; + unsigned int __pyx_v_k; + unsigned int __pyx_v_n; + __Pyx_LocalBuf_ND __pyx_pybuffernd_boxes; + __Pyx_Buffer __pyx_pybuffer_boxes; + __Pyx_LocalBuf_ND __pyx_pybuffernd_overlaps; + __Pyx_Buffer __pyx_pybuffer_overlaps; + __Pyx_LocalBuf_ND __pyx_pybuffernd_query_boxes; + __Pyx_Buffer __pyx_pybuffer_query_boxes; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyArrayObject *__pyx_t_5 = NULL; + unsigned int __pyx_t_6; + unsigned int __pyx_t_7; + size_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + size_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + size_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + size_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + unsigned int __pyx_t_17; + unsigned int __pyx_t_18; + size_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_21; + size_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_24; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_25; + size_t __pyx_t_26; + Py_ssize_t __pyx_t_27; + size_t __pyx_t_28; + Py_ssize_t __pyx_t_29; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_30; + int __pyx_t_31; + size_t __pyx_t_32; + Py_ssize_t __pyx_t_33; + size_t __pyx_t_34; + Py_ssize_t __pyx_t_35; + size_t __pyx_t_36; + Py_ssize_t __pyx_t_37; + size_t __pyx_t_38; + Py_ssize_t __pyx_t_39; + size_t __pyx_t_40; + Py_ssize_t __pyx_t_41; + size_t __pyx_t_42; + Py_ssize_t __pyx_t_43; + size_t __pyx_t_44; + Py_ssize_t __pyx_t_45; + size_t __pyx_t_46; + Py_ssize_t __pyx_t_47; + size_t __pyx_t_48; + size_t __pyx_t_49; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("bbox_overlaps_float", 0); + __pyx_pybuffer_overlaps.pybuffer.buf = NULL; + __pyx_pybuffer_overlaps.refcount = 0; + __pyx_pybuffernd_overlaps.data = NULL; + __pyx_pybuffernd_overlaps.rcbuffer = &__pyx_pybuffer_overlaps; + __pyx_pybuffer_boxes.pybuffer.buf = NULL; + __pyx_pybuffer_boxes.refcount = 0; + __pyx_pybuffernd_boxes.data = NULL; + __pyx_pybuffernd_boxes.rcbuffer = &__pyx_pybuffer_boxes; + __pyx_pybuffer_query_boxes.pybuffer.buf = NULL; + __pyx_pybuffer_query_boxes.refcount = 0; + __pyx_pybuffernd_query_boxes.data = NULL; + __pyx_pybuffernd_query_boxes.rcbuffer = &__pyx_pybuffer_query_boxes; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_boxes.rcbuffer->pybuffer, (PyObject*)__pyx_v_boxes, &__Pyx_TypeInfo_nn___pyx_t_5utils_11cython_bbox_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_pybuffernd_boxes.diminfo[0].strides = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_boxes.diminfo[0].shape = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_boxes.diminfo[1].strides = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_boxes.diminfo[1].shape = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_query_boxes.rcbuffer->pybuffer, (PyObject*)__pyx_v_query_boxes, &__Pyx_TypeInfo_nn___pyx_t_5utils_11cython_bbox_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_pybuffernd_query_boxes.diminfo[0].strides = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_query_boxes.diminfo[0].shape = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_query_boxes.diminfo[1].strides = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_query_boxes.diminfo[1].shape = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.shape[1]; + + /* "utils/bbox.pyx":27 + * overlaps: (N, K) ndarray of overlap between boxes and query_boxes + * """ + * cdef unsigned int N = boxes.shape[0] # <<<<<<<<<<<<<< + * cdef unsigned int K = query_boxes.shape[0] + * cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) + */ + __pyx_v_N = (__pyx_v_boxes->dimensions[0]); + + /* "utils/bbox.pyx":28 + * """ + * cdef unsigned int N = boxes.shape[0] + * cdef unsigned int K = query_boxes.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) + * cdef DTYPE_t iw, ih, box_area + */ + __pyx_v_K = (__pyx_v_query_boxes->dimensions[0]); + + /* "utils/bbox.pyx":29 + * cdef unsigned int N = boxes.shape[0] + * cdef unsigned int K = query_boxes.shape[0] + * cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) # <<<<<<<<<<<<<< + * cdef DTYPE_t iw, ih, box_area + * cdef DTYPE_t ua + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_From_unsigned_int(__pyx_v_K); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = ((PyArrayObject *)__pyx_t_1); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_overlaps.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_5utils_11cython_bbox_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_overlaps = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.buf = NULL; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } else {__pyx_pybuffernd_overlaps.diminfo[0].strides = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_overlaps.diminfo[0].shape = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_overlaps.diminfo[1].strides = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_overlaps.diminfo[1].shape = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_5 = 0; + __pyx_v_overlaps = ((PyArrayObject *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "utils/bbox.pyx":33 + * cdef DTYPE_t ua + * cdef unsigned int k, n + * for k in range(K): # <<<<<<<<<<<<<< + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0]) * + */ + __pyx_t_6 = __pyx_v_K; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_k = __pyx_t_7; + + /* "utils/bbox.pyx":35 + * for k in range(K): + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0]) * # <<<<<<<<<<<<<< + * (query_boxes[k, 3] - query_boxes[k, 1]) + * ) + */ + __pyx_t_8 = __pyx_v_k; + __pyx_t_9 = 2; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_8 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_9 < 0) { + __pyx_t_9 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_9 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_9 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_11 = __pyx_v_k; + __pyx_t_12 = 0; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_11 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_12 < 0) { + __pyx_t_12 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_12 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_12 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "utils/bbox.pyx":36 + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0]) * + * (query_boxes[k, 3] - query_boxes[k, 1]) # <<<<<<<<<<<<<< + * ) + * for n in range(N): + */ + __pyx_t_13 = __pyx_v_k; + __pyx_t_14 = 3; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_13 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_14 < 0) { + __pyx_t_14 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_14 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_14 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_15 = __pyx_v_k; + __pyx_t_16 = 1; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_15 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_16 < 0) { + __pyx_t_16 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_16 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_16 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "utils/bbox.pyx":35 + * for k in range(K): + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0]) * # <<<<<<<<<<<<<< + * (query_boxes[k, 3] - query_boxes[k, 1]) + * ) + */ + __pyx_v_box_area = (((*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_query_boxes.diminfo[1].strides)) - (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_query_boxes.diminfo[1].strides))) * ((*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_query_boxes.diminfo[1].strides)) - (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_query_boxes.diminfo[1].strides)))); + + /* "utils/bbox.pyx":38 + * (query_boxes[k, 3] - query_boxes[k, 1]) + * ) + * for n in range(N): # <<<<<<<<<<<<<< + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - + */ + __pyx_t_17 = __pyx_v_N; + for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) { + __pyx_v_n = __pyx_t_18; + + /* "utils/bbox.pyx":40 + * for n in range(N): + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - # <<<<<<<<<<<<<< + * max(boxes[n, 0], query_boxes[k, 0]) + * ) + */ + __pyx_t_19 = __pyx_v_k; + __pyx_t_20 = 2; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_19 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_20 < 0) { + __pyx_t_20 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_20 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_20 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_22 = __pyx_v_n; + __pyx_t_23 = 2; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_22 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_23 < 0) { + __pyx_t_23 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_23 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_23 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_24 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_21 < __pyx_t_24) != 0)) { + __pyx_t_25 = __pyx_t_21; + } else { + __pyx_t_25 = __pyx_t_24; + } + + /* "utils/bbox.pyx":41 + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - + * max(boxes[n, 0], query_boxes[k, 0]) # <<<<<<<<<<<<<< + * ) + * if iw > 0: + */ + __pyx_t_26 = __pyx_v_k; + __pyx_t_27 = 0; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_26 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_27 < 0) { + __pyx_t_27 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_27 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_27 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_27, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_28 = __pyx_v_n; + __pyx_t_29 = 0; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_28 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_29 < 0) { + __pyx_t_29 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_29 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_29 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_24 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_28, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_29, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_21 > __pyx_t_24) != 0)) { + __pyx_t_30 = __pyx_t_21; + } else { + __pyx_t_30 = __pyx_t_24; + } + + /* "utils/bbox.pyx":40 + * for n in range(N): + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - # <<<<<<<<<<<<<< + * max(boxes[n, 0], query_boxes[k, 0]) + * ) + */ + __pyx_v_iw = (__pyx_t_25 - __pyx_t_30); + + /* "utils/bbox.pyx":43 + * max(boxes[n, 0], query_boxes[k, 0]) + * ) + * if iw > 0: # <<<<<<<<<<<<<< + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - + */ + __pyx_t_31 = ((__pyx_v_iw > 0.0) != 0); + if (__pyx_t_31) { + + /* "utils/bbox.pyx":45 + * if iw > 0: + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - # <<<<<<<<<<<<<< + * max(boxes[n, 1], query_boxes[k, 1]) + * ) + */ + __pyx_t_32 = __pyx_v_k; + __pyx_t_33 = 3; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_32 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_33 < 0) { + __pyx_t_33 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_33 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_33 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_30 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_32, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_33, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_34 = __pyx_v_n; + __pyx_t_35 = 3; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_34 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_35 < 0) { + __pyx_t_35 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_35 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_35 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 45; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_25 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_34, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_35, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_30 < __pyx_t_25) != 0)) { + __pyx_t_21 = __pyx_t_30; + } else { + __pyx_t_21 = __pyx_t_25; + } + + /* "utils/bbox.pyx":46 + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - + * max(boxes[n, 1], query_boxes[k, 1]) # <<<<<<<<<<<<<< + * ) + * if ih > 0: + */ + __pyx_t_36 = __pyx_v_k; + __pyx_t_37 = 1; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_36 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_37 < 0) { + __pyx_t_37 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_37 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_37 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_30 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_36, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_37, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_38 = __pyx_v_n; + __pyx_t_39 = 1; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_38 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_39 < 0) { + __pyx_t_39 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_39 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_39 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_25 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_38, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_39, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_30 > __pyx_t_25) != 0)) { + __pyx_t_24 = __pyx_t_30; + } else { + __pyx_t_24 = __pyx_t_25; + } + + /* "utils/bbox.pyx":45 + * if iw > 0: + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - # <<<<<<<<<<<<<< + * max(boxes[n, 1], query_boxes[k, 1]) + * ) + */ + __pyx_v_ih = (__pyx_t_21 - __pyx_t_24); + + /* "utils/bbox.pyx":48 + * max(boxes[n, 1], query_boxes[k, 1]) + * ) + * if ih > 0: # <<<<<<<<<<<<<< + * ua = float( + * (boxes[n, 2] - boxes[n, 0]) * + */ + __pyx_t_31 = ((__pyx_v_ih > 0.0) != 0); + if (__pyx_t_31) { + + /* "utils/bbox.pyx":50 + * if ih > 0: + * ua = float( + * (boxes[n, 2] - boxes[n, 0]) * # <<<<<<<<<<<<<< + * (boxes[n, 3] - boxes[n, 1]) + + * box_area - iw * ih + */ + __pyx_t_40 = __pyx_v_n; + __pyx_t_41 = 2; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_40 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_41 < 0) { + __pyx_t_41 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_41 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_41 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_42 = __pyx_v_n; + __pyx_t_43 = 0; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_42 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_43 < 0) { + __pyx_t_43 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_43 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_43 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "utils/bbox.pyx":51 + * ua = float( + * (boxes[n, 2] - boxes[n, 0]) * + * (boxes[n, 3] - boxes[n, 1]) + # <<<<<<<<<<<<<< + * box_area - iw * ih + * ) + */ + __pyx_t_44 = __pyx_v_n; + __pyx_t_45 = 3; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_44 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_45 < 0) { + __pyx_t_45 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_45 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_45 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_46 = __pyx_v_n; + __pyx_t_47 = 1; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_46 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_47 < 0) { + __pyx_t_47 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_47 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_47 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "utils/bbox.pyx":49 + * ) + * if ih > 0: + * ua = float( # <<<<<<<<<<<<<< + * (boxes[n, 2] - boxes[n, 0]) * + * (boxes[n, 3] - boxes[n, 1]) + + */ + __pyx_v_ua = ((double)(((((*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_40, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_41, __pyx_pybuffernd_boxes.diminfo[1].strides)) - (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_42, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_43, __pyx_pybuffernd_boxes.diminfo[1].strides))) * ((*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_44, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_45, __pyx_pybuffernd_boxes.diminfo[1].strides)) - (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_46, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_47, __pyx_pybuffernd_boxes.diminfo[1].strides)))) + __pyx_v_box_area) - (__pyx_v_iw * __pyx_v_ih))); + + /* "utils/bbox.pyx":63 + * # box_area - iw * ih + * # ) + * overlaps[n, k] = iw * ih / ua # <<<<<<<<<<<<<< + * return overlaps + * + */ + __pyx_t_24 = (__pyx_v_iw * __pyx_v_ih); + if (unlikely(__pyx_v_ua == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_48 = __pyx_v_n; + __pyx_t_49 = __pyx_v_k; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_48 >= (size_t)__pyx_pybuffernd_overlaps.diminfo[0].shape)) __pyx_t_10 = 0; + if (unlikely(__pyx_t_49 >= (size_t)__pyx_pybuffernd_overlaps.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + *__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.buf, __pyx_t_48, __pyx_pybuffernd_overlaps.diminfo[0].strides, __pyx_t_49, __pyx_pybuffernd_overlaps.diminfo[1].strides) = (__pyx_t_24 / __pyx_v_ua); + + /* "utils/bbox.pyx":48 + * max(boxes[n, 1], query_boxes[k, 1]) + * ) + * if ih > 0: # <<<<<<<<<<<<<< + * ua = float( + * (boxes[n, 2] - boxes[n, 0]) * + */ + } + + /* "utils/bbox.pyx":43 + * max(boxes[n, 0], query_boxes[k, 0]) + * ) + * if iw > 0: # <<<<<<<<<<<<<< + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - + */ + } + } + } + + /* "utils/bbox.pyx":64 + * # ) + * overlaps[n, k] = iw * ih / ua + * return overlaps # <<<<<<<<<<<<<< + * + * def bbox_overlaps( + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_overlaps)); + __pyx_r = ((PyObject *)__pyx_v_overlaps); + goto __pyx_L0; + + /* "utils/bbox.pyx":15 + * ctypedef np.float_t DTYPE_t + * + * def bbox_overlaps_float( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_boxes.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_overlaps.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_query_boxes.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("utils.cython_bbox.bbox_overlaps_float", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_boxes.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_overlaps.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_query_boxes.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_overlaps); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "utils/bbox.pyx":66 + * return overlaps + * + * def bbox_overlaps( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5utils_11cython_bbox_3bbox_overlaps(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_5utils_11cython_bbox_2bbox_overlaps[] = "\n Parameters\n ----------\n boxes: (N, 4) ndarray of float\n query_boxes: (K, 4) ndarray of float\n Returns\n -------\n overlaps: (N, K) ndarray of overlap between boxes and query_boxes\n "; +static PyMethodDef __pyx_mdef_5utils_11cython_bbox_3bbox_overlaps = {"bbox_overlaps", (PyCFunction)__pyx_pw_5utils_11cython_bbox_3bbox_overlaps, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5utils_11cython_bbox_2bbox_overlaps}; +static PyObject *__pyx_pw_5utils_11cython_bbox_3bbox_overlaps(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_boxes = 0; + PyArrayObject *__pyx_v_query_boxes = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("bbox_overlaps (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_boxes,&__pyx_n_s_query_boxes,0}; + PyObject* values[2] = {0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_boxes)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_query_boxes)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("bbox_overlaps", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "bbox_overlaps") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + } + __pyx_v_boxes = ((PyArrayObject *)values[0]); + __pyx_v_query_boxes = ((PyArrayObject *)values[1]); + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("bbox_overlaps", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("utils.cython_bbox.bbox_overlaps", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_boxes), __pyx_ptype_5numpy_ndarray, 1, "boxes", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_query_boxes), __pyx_ptype_5numpy_ndarray, 1, "query_boxes", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_5utils_11cython_bbox_2bbox_overlaps(__pyx_self, __pyx_v_boxes, __pyx_v_query_boxes); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5utils_11cython_bbox_2bbox_overlaps(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_boxes, PyArrayObject *__pyx_v_query_boxes) { + unsigned int __pyx_v_N; + unsigned int __pyx_v_K; + PyArrayObject *__pyx_v_overlaps = 0; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_iw; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_ih; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_box_area; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_ua; + unsigned int __pyx_v_k; + unsigned int __pyx_v_n; + __Pyx_LocalBuf_ND __pyx_pybuffernd_boxes; + __Pyx_Buffer __pyx_pybuffer_boxes; + __Pyx_LocalBuf_ND __pyx_pybuffernd_overlaps; + __Pyx_Buffer __pyx_pybuffer_overlaps; + __Pyx_LocalBuf_ND __pyx_pybuffernd_query_boxes; + __Pyx_Buffer __pyx_pybuffer_query_boxes; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyArrayObject *__pyx_t_5 = NULL; + unsigned int __pyx_t_6; + unsigned int __pyx_t_7; + size_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + size_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + size_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + size_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + unsigned int __pyx_t_17; + unsigned int __pyx_t_18; + size_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_21; + size_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_24; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_25; + size_t __pyx_t_26; + Py_ssize_t __pyx_t_27; + size_t __pyx_t_28; + Py_ssize_t __pyx_t_29; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_30; + int __pyx_t_31; + size_t __pyx_t_32; + Py_ssize_t __pyx_t_33; + size_t __pyx_t_34; + Py_ssize_t __pyx_t_35; + size_t __pyx_t_36; + Py_ssize_t __pyx_t_37; + size_t __pyx_t_38; + Py_ssize_t __pyx_t_39; + size_t __pyx_t_40; + Py_ssize_t __pyx_t_41; + size_t __pyx_t_42; + Py_ssize_t __pyx_t_43; + size_t __pyx_t_44; + Py_ssize_t __pyx_t_45; + size_t __pyx_t_46; + Py_ssize_t __pyx_t_47; + size_t __pyx_t_48; + size_t __pyx_t_49; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("bbox_overlaps", 0); + __pyx_pybuffer_overlaps.pybuffer.buf = NULL; + __pyx_pybuffer_overlaps.refcount = 0; + __pyx_pybuffernd_overlaps.data = NULL; + __pyx_pybuffernd_overlaps.rcbuffer = &__pyx_pybuffer_overlaps; + __pyx_pybuffer_boxes.pybuffer.buf = NULL; + __pyx_pybuffer_boxes.refcount = 0; + __pyx_pybuffernd_boxes.data = NULL; + __pyx_pybuffernd_boxes.rcbuffer = &__pyx_pybuffer_boxes; + __pyx_pybuffer_query_boxes.pybuffer.buf = NULL; + __pyx_pybuffer_query_boxes.refcount = 0; + __pyx_pybuffernd_query_boxes.data = NULL; + __pyx_pybuffernd_query_boxes.rcbuffer = &__pyx_pybuffer_query_boxes; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_boxes.rcbuffer->pybuffer, (PyObject*)__pyx_v_boxes, &__Pyx_TypeInfo_nn___pyx_t_5utils_11cython_bbox_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_pybuffernd_boxes.diminfo[0].strides = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_boxes.diminfo[0].shape = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_boxes.diminfo[1].strides = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_boxes.diminfo[1].shape = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_query_boxes.rcbuffer->pybuffer, (PyObject*)__pyx_v_query_boxes, &__Pyx_TypeInfo_nn___pyx_t_5utils_11cython_bbox_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_pybuffernd_query_boxes.diminfo[0].strides = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_query_boxes.diminfo[0].shape = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_query_boxes.diminfo[1].strides = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_query_boxes.diminfo[1].shape = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.shape[1]; + + /* "utils/bbox.pyx":78 + * overlaps: (N, K) ndarray of overlap between boxes and query_boxes + * """ + * cdef unsigned int N = boxes.shape[0] # <<<<<<<<<<<<<< + * cdef unsigned int K = query_boxes.shape[0] + * cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) + */ + __pyx_v_N = (__pyx_v_boxes->dimensions[0]); + + /* "utils/bbox.pyx":79 + * """ + * cdef unsigned int N = boxes.shape[0] + * cdef unsigned int K = query_boxes.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) + * cdef DTYPE_t iw, ih, box_area + */ + __pyx_v_K = (__pyx_v_query_boxes->dimensions[0]); + + /* "utils/bbox.pyx":80 + * cdef unsigned int N = boxes.shape[0] + * cdef unsigned int K = query_boxes.shape[0] + * cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) # <<<<<<<<<<<<<< + * cdef DTYPE_t iw, ih, box_area + * cdef DTYPE_t ua + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_From_unsigned_int(__pyx_v_K); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = ((PyArrayObject *)__pyx_t_1); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_overlaps.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_5utils_11cython_bbox_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_overlaps = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.buf = NULL; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 80; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } else {__pyx_pybuffernd_overlaps.diminfo[0].strides = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_overlaps.diminfo[0].shape = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_overlaps.diminfo[1].strides = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_overlaps.diminfo[1].shape = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_5 = 0; + __pyx_v_overlaps = ((PyArrayObject *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "utils/bbox.pyx":84 + * cdef DTYPE_t ua + * cdef unsigned int k, n + * for k in range(K): # <<<<<<<<<<<<<< + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0] + 1) * + */ + __pyx_t_6 = __pyx_v_K; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_k = __pyx_t_7; + + /* "utils/bbox.pyx":86 + * for k in range(K): + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0] + 1) * # <<<<<<<<<<<<<< + * (query_boxes[k, 3] - query_boxes[k, 1] + 1) + * ) + */ + __pyx_t_8 = __pyx_v_k; + __pyx_t_9 = 2; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_8 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_9 < 0) { + __pyx_t_9 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_9 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_9 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_11 = __pyx_v_k; + __pyx_t_12 = 0; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_11 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_12 < 0) { + __pyx_t_12 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_12 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_12 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 86; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "utils/bbox.pyx":87 + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0] + 1) * + * (query_boxes[k, 3] - query_boxes[k, 1] + 1) # <<<<<<<<<<<<<< + * ) + * for n in range(N): + */ + __pyx_t_13 = __pyx_v_k; + __pyx_t_14 = 3; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_13 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_14 < 0) { + __pyx_t_14 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_14 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_14 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_15 = __pyx_v_k; + __pyx_t_16 = 1; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_15 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_16 < 0) { + __pyx_t_16 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_16 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_16 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "utils/bbox.pyx":86 + * for k in range(K): + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0] + 1) * # <<<<<<<<<<<<<< + * (query_boxes[k, 3] - query_boxes[k, 1] + 1) + * ) + */ + __pyx_v_box_area = ((((*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_query_boxes.diminfo[1].strides)) - (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_query_boxes.diminfo[1].strides))) + 1.0) * (((*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_query_boxes.diminfo[1].strides)) - (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_query_boxes.diminfo[1].strides))) + 1.0)); + + /* "utils/bbox.pyx":89 + * (query_boxes[k, 3] - query_boxes[k, 1] + 1) + * ) + * for n in range(N): # <<<<<<<<<<<<<< + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - + */ + __pyx_t_17 = __pyx_v_N; + for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) { + __pyx_v_n = __pyx_t_18; + + /* "utils/bbox.pyx":91 + * for n in range(N): + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - # <<<<<<<<<<<<<< + * max(boxes[n, 0], query_boxes[k, 0]) + 1 + * ) + */ + __pyx_t_19 = __pyx_v_k; + __pyx_t_20 = 2; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_19 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_20 < 0) { + __pyx_t_20 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_20 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_20 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_22 = __pyx_v_n; + __pyx_t_23 = 2; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_22 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_23 < 0) { + __pyx_t_23 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_23 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_23 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_24 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_21 < __pyx_t_24) != 0)) { + __pyx_t_25 = __pyx_t_21; + } else { + __pyx_t_25 = __pyx_t_24; + } + + /* "utils/bbox.pyx":92 + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - + * max(boxes[n, 0], query_boxes[k, 0]) + 1 # <<<<<<<<<<<<<< + * ) + * if iw > 0: + */ + __pyx_t_26 = __pyx_v_k; + __pyx_t_27 = 0; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_26 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_27 < 0) { + __pyx_t_27 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_27 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_27 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_27, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_28 = __pyx_v_n; + __pyx_t_29 = 0; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_28 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_29 < 0) { + __pyx_t_29 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_29 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_29 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_24 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_28, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_29, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_21 > __pyx_t_24) != 0)) { + __pyx_t_30 = __pyx_t_21; + } else { + __pyx_t_30 = __pyx_t_24; + } + + /* "utils/bbox.pyx":91 + * for n in range(N): + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - # <<<<<<<<<<<<<< + * max(boxes[n, 0], query_boxes[k, 0]) + 1 + * ) + */ + __pyx_v_iw = ((__pyx_t_25 - __pyx_t_30) + 1.0); + + /* "utils/bbox.pyx":94 + * max(boxes[n, 0], query_boxes[k, 0]) + 1 + * ) + * if iw > 0: # <<<<<<<<<<<<<< + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - + */ + __pyx_t_31 = ((__pyx_v_iw > 0.0) != 0); + if (__pyx_t_31) { + + /* "utils/bbox.pyx":96 + * if iw > 0: + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - # <<<<<<<<<<<<<< + * max(boxes[n, 1], query_boxes[k, 1]) + 1 + * ) + */ + __pyx_t_32 = __pyx_v_k; + __pyx_t_33 = 3; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_32 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_33 < 0) { + __pyx_t_33 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_33 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_33 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_30 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_32, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_33, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_34 = __pyx_v_n; + __pyx_t_35 = 3; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_34 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_35 < 0) { + __pyx_t_35 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_35 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_35 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 96; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_25 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_34, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_35, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_30 < __pyx_t_25) != 0)) { + __pyx_t_21 = __pyx_t_30; + } else { + __pyx_t_21 = __pyx_t_25; + } + + /* "utils/bbox.pyx":97 + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - + * max(boxes[n, 1], query_boxes[k, 1]) + 1 # <<<<<<<<<<<<<< + * ) + * if ih > 0: + */ + __pyx_t_36 = __pyx_v_k; + __pyx_t_37 = 1; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_36 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_37 < 0) { + __pyx_t_37 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_37 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_37 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_30 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_36, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_37, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_38 = __pyx_v_n; + __pyx_t_39 = 1; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_38 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_39 < 0) { + __pyx_t_39 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_39 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_39 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_25 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_38, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_39, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_30 > __pyx_t_25) != 0)) { + __pyx_t_24 = __pyx_t_30; + } else { + __pyx_t_24 = __pyx_t_25; + } + + /* "utils/bbox.pyx":96 + * if iw > 0: + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - # <<<<<<<<<<<<<< + * max(boxes[n, 1], query_boxes[k, 1]) + 1 + * ) + */ + __pyx_v_ih = ((__pyx_t_21 - __pyx_t_24) + 1.0); + + /* "utils/bbox.pyx":99 + * max(boxes[n, 1], query_boxes[k, 1]) + 1 + * ) + * if ih > 0: # <<<<<<<<<<<<<< + * ua = float( + * (boxes[n, 2] - boxes[n, 0] + 1) * + */ + __pyx_t_31 = ((__pyx_v_ih > 0.0) != 0); + if (__pyx_t_31) { + + /* "utils/bbox.pyx":101 + * if ih > 0: + * ua = float( + * (boxes[n, 2] - boxes[n, 0] + 1) * # <<<<<<<<<<<<<< + * (boxes[n, 3] - boxes[n, 1] + 1) + + * box_area - iw * ih + */ + __pyx_t_40 = __pyx_v_n; + __pyx_t_41 = 2; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_40 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_41 < 0) { + __pyx_t_41 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_41 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_41 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_42 = __pyx_v_n; + __pyx_t_43 = 0; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_42 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_43 < 0) { + __pyx_t_43 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_43 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_43 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "utils/bbox.pyx":102 + * ua = float( + * (boxes[n, 2] - boxes[n, 0] + 1) * + * (boxes[n, 3] - boxes[n, 1] + 1) + # <<<<<<<<<<<<<< + * box_area - iw * ih + * ) + */ + __pyx_t_44 = __pyx_v_n; + __pyx_t_45 = 3; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_44 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_45 < 0) { + __pyx_t_45 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_45 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_45 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_46 = __pyx_v_n; + __pyx_t_47 = 1; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_46 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_47 < 0) { + __pyx_t_47 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_47 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_47 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 102; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "utils/bbox.pyx":100 + * ) + * if ih > 0: + * ua = float( # <<<<<<<<<<<<<< + * (boxes[n, 2] - boxes[n, 0] + 1) * + * (boxes[n, 3] - boxes[n, 1] + 1) + + */ + __pyx_v_ua = ((double)((((((*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_40, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_41, __pyx_pybuffernd_boxes.diminfo[1].strides)) - (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_42, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_43, __pyx_pybuffernd_boxes.diminfo[1].strides))) + 1.0) * (((*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_44, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_45, __pyx_pybuffernd_boxes.diminfo[1].strides)) - (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_46, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_47, __pyx_pybuffernd_boxes.diminfo[1].strides))) + 1.0)) + __pyx_v_box_area) - (__pyx_v_iw * __pyx_v_ih))); + + /* "utils/bbox.pyx":105 + * box_area - iw * ih + * ) + * overlaps[n, k] = iw * ih / ua # <<<<<<<<<<<<<< + * return overlaps + * + */ + __pyx_t_24 = (__pyx_v_iw * __pyx_v_ih); + if (unlikely(__pyx_v_ua == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_48 = __pyx_v_n; + __pyx_t_49 = __pyx_v_k; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_48 >= (size_t)__pyx_pybuffernd_overlaps.diminfo[0].shape)) __pyx_t_10 = 0; + if (unlikely(__pyx_t_49 >= (size_t)__pyx_pybuffernd_overlaps.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + *__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.buf, __pyx_t_48, __pyx_pybuffernd_overlaps.diminfo[0].strides, __pyx_t_49, __pyx_pybuffernd_overlaps.diminfo[1].strides) = (__pyx_t_24 / __pyx_v_ua); + + /* "utils/bbox.pyx":99 + * max(boxes[n, 1], query_boxes[k, 1]) + 1 + * ) + * if ih > 0: # <<<<<<<<<<<<<< + * ua = float( + * (boxes[n, 2] - boxes[n, 0] + 1) * + */ + } + + /* "utils/bbox.pyx":94 + * max(boxes[n, 0], query_boxes[k, 0]) + 1 + * ) + * if iw > 0: # <<<<<<<<<<<<<< + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - + */ + } + } + } + + /* "utils/bbox.pyx":106 + * ) + * overlaps[n, k] = iw * ih / ua + * return overlaps # <<<<<<<<<<<<<< + * + * def bbox_overlaps_self( + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_overlaps)); + __pyx_r = ((PyObject *)__pyx_v_overlaps); + goto __pyx_L0; + + /* "utils/bbox.pyx":66 + * return overlaps + * + * def bbox_overlaps( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_boxes.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_overlaps.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_query_boxes.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("utils.cython_bbox.bbox_overlaps", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_boxes.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_overlaps.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_query_boxes.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_overlaps); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "utils/bbox.pyx":108 + * return overlaps + * + * def bbox_overlaps_self( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_5utils_11cython_bbox_5bbox_overlaps_self(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_5utils_11cython_bbox_4bbox_overlaps_self[] = "\n Parameters\n ----------\n boxes: (N, 4) ndarray of float\n query_boxes: (K, 4) ndarray of float\n Returns\n -------\n overlaps: (N, K) ndarray of overlap between boxes and query_boxes\n "; +static PyMethodDef __pyx_mdef_5utils_11cython_bbox_5bbox_overlaps_self = {"bbox_overlaps_self", (PyCFunction)__pyx_pw_5utils_11cython_bbox_5bbox_overlaps_self, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5utils_11cython_bbox_4bbox_overlaps_self}; +static PyObject *__pyx_pw_5utils_11cython_bbox_5bbox_overlaps_self(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyArrayObject *__pyx_v_boxes = 0; + PyArrayObject *__pyx_v_query_boxes = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("bbox_overlaps_self (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_boxes,&__pyx_n_s_query_boxes,0}; + PyObject* values[2] = {0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_boxes)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + case 1: + if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_query_boxes)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("bbox_overlaps_self", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "bbox_overlaps_self") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + } + __pyx_v_boxes = ((PyArrayObject *)values[0]); + __pyx_v_query_boxes = ((PyArrayObject *)values[1]); + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("bbox_overlaps_self", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L3_error;} + __pyx_L3_error:; + __Pyx_AddTraceback("utils.cython_bbox.bbox_overlaps_self", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_boxes), __pyx_ptype_5numpy_ndarray, 1, "boxes", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 109; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_query_boxes), __pyx_ptype_5numpy_ndarray, 1, "query_boxes", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_r = __pyx_pf_5utils_11cython_bbox_4bbox_overlaps_self(__pyx_self, __pyx_v_boxes, __pyx_v_query_boxes); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_5utils_11cython_bbox_4bbox_overlaps_self(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_boxes, PyArrayObject *__pyx_v_query_boxes) { + unsigned int __pyx_v_N; + unsigned int __pyx_v_K; + PyArrayObject *__pyx_v_overlaps = 0; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_iw; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_ih; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_box_area; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_v_ua; + unsigned int __pyx_v_k; + unsigned int __pyx_v_n; + __Pyx_LocalBuf_ND __pyx_pybuffernd_boxes; + __Pyx_Buffer __pyx_pybuffer_boxes; + __Pyx_LocalBuf_ND __pyx_pybuffernd_overlaps; + __Pyx_Buffer __pyx_pybuffer_overlaps; + __Pyx_LocalBuf_ND __pyx_pybuffernd_query_boxes; + __Pyx_Buffer __pyx_pybuffer_query_boxes; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyArrayObject *__pyx_t_5 = NULL; + unsigned int __pyx_t_6; + unsigned int __pyx_t_7; + size_t __pyx_t_8; + Py_ssize_t __pyx_t_9; + int __pyx_t_10; + size_t __pyx_t_11; + Py_ssize_t __pyx_t_12; + size_t __pyx_t_13; + Py_ssize_t __pyx_t_14; + size_t __pyx_t_15; + Py_ssize_t __pyx_t_16; + unsigned int __pyx_t_17; + unsigned int __pyx_t_18; + size_t __pyx_t_19; + Py_ssize_t __pyx_t_20; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_21; + size_t __pyx_t_22; + Py_ssize_t __pyx_t_23; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_24; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_25; + size_t __pyx_t_26; + Py_ssize_t __pyx_t_27; + size_t __pyx_t_28; + Py_ssize_t __pyx_t_29; + __pyx_t_5utils_11cython_bbox_DTYPE_t __pyx_t_30; + int __pyx_t_31; + size_t __pyx_t_32; + Py_ssize_t __pyx_t_33; + size_t __pyx_t_34; + Py_ssize_t __pyx_t_35; + size_t __pyx_t_36; + Py_ssize_t __pyx_t_37; + size_t __pyx_t_38; + Py_ssize_t __pyx_t_39; + size_t __pyx_t_40; + size_t __pyx_t_41; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("bbox_overlaps_self", 0); + __pyx_pybuffer_overlaps.pybuffer.buf = NULL; + __pyx_pybuffer_overlaps.refcount = 0; + __pyx_pybuffernd_overlaps.data = NULL; + __pyx_pybuffernd_overlaps.rcbuffer = &__pyx_pybuffer_overlaps; + __pyx_pybuffer_boxes.pybuffer.buf = NULL; + __pyx_pybuffer_boxes.refcount = 0; + __pyx_pybuffernd_boxes.data = NULL; + __pyx_pybuffernd_boxes.rcbuffer = &__pyx_pybuffer_boxes; + __pyx_pybuffer_query_boxes.pybuffer.buf = NULL; + __pyx_pybuffer_query_boxes.refcount = 0; + __pyx_pybuffernd_query_boxes.data = NULL; + __pyx_pybuffernd_query_boxes.rcbuffer = &__pyx_pybuffer_query_boxes; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_boxes.rcbuffer->pybuffer, (PyObject*)__pyx_v_boxes, &__Pyx_TypeInfo_nn___pyx_t_5utils_11cython_bbox_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_pybuffernd_boxes.diminfo[0].strides = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_boxes.diminfo[0].shape = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_boxes.diminfo[1].strides = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_boxes.diminfo[1].shape = __pyx_pybuffernd_boxes.rcbuffer->pybuffer.shape[1]; + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_query_boxes.rcbuffer->pybuffer, (PyObject*)__pyx_v_query_boxes, &__Pyx_TypeInfo_nn___pyx_t_5utils_11cython_bbox_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_pybuffernd_query_boxes.diminfo[0].strides = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_query_boxes.diminfo[0].shape = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_query_boxes.diminfo[1].strides = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_query_boxes.diminfo[1].shape = __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.shape[1]; + + /* "utils/bbox.pyx":120 + * overlaps: (N, K) ndarray of overlap between boxes and query_boxes + * """ + * cdef unsigned int N = boxes.shape[0] # <<<<<<<<<<<<<< + * cdef unsigned int K = query_boxes.shape[0] + * cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) + */ + __pyx_v_N = (__pyx_v_boxes->dimensions[0]); + + /* "utils/bbox.pyx":121 + * """ + * cdef unsigned int N = boxes.shape[0] + * cdef unsigned int K = query_boxes.shape[0] # <<<<<<<<<<<<<< + * cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) + * cdef DTYPE_t iw, ih, box_area + */ + __pyx_v_K = (__pyx_v_query_boxes->dimensions[0]); + + /* "utils/bbox.pyx":122 + * cdef unsigned int N = boxes.shape[0] + * cdef unsigned int K = query_boxes.shape[0] + * cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) # <<<<<<<<<<<<<< + * cdef DTYPE_t iw, ih, box_area + * cdef DTYPE_t ua + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyInt_From_unsigned_int(__pyx_v_N); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyInt_From_unsigned_int(__pyx_v_K); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); + __pyx_t_1 = 0; + __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_t_5 = ((PyArrayObject *)__pyx_t_1); + { + __Pyx_BufFmt_StackElem __pyx_stack[1]; + if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_overlaps.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_5utils_11cython_bbox_DTYPE_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) { + __pyx_v_overlaps = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.buf = NULL; + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } else {__pyx_pybuffernd_overlaps.diminfo[0].strides = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_overlaps.diminfo[0].shape = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_overlaps.diminfo[1].strides = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_overlaps.diminfo[1].shape = __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.shape[1]; + } + } + __pyx_t_5 = 0; + __pyx_v_overlaps = ((PyArrayObject *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "utils/bbox.pyx":126 + * cdef DTYPE_t ua + * cdef unsigned int k, n + * for k in range(K): # <<<<<<<<<<<<<< + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0] + 1) * + */ + __pyx_t_6 = __pyx_v_K; + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) { + __pyx_v_k = __pyx_t_7; + + /* "utils/bbox.pyx":128 + * for k in range(K): + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0] + 1) * # <<<<<<<<<<<<<< + * (query_boxes[k, 3] - query_boxes[k, 1] + 1) + * ) + */ + __pyx_t_8 = __pyx_v_k; + __pyx_t_9 = 2; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_8 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_9 < 0) { + __pyx_t_9 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_9 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_9 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_11 = __pyx_v_k; + __pyx_t_12 = 0; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_11 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_12 < 0) { + __pyx_t_12 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_12 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_12 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "utils/bbox.pyx":129 + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0] + 1) * + * (query_boxes[k, 3] - query_boxes[k, 1] + 1) # <<<<<<<<<<<<<< + * ) + * for n in range(N): + */ + __pyx_t_13 = __pyx_v_k; + __pyx_t_14 = 3; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_13 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_14 < 0) { + __pyx_t_14 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_14 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_14 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_15 = __pyx_v_k; + __pyx_t_16 = 1; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_15 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_16 < 0) { + __pyx_t_16 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_16 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_16 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + + /* "utils/bbox.pyx":128 + * for k in range(K): + * box_area = ( + * (query_boxes[k, 2] - query_boxes[k, 0] + 1) * # <<<<<<<<<<<<<< + * (query_boxes[k, 3] - query_boxes[k, 1] + 1) + * ) + */ + __pyx_v_box_area = ((((*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_8, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_9, __pyx_pybuffernd_query_boxes.diminfo[1].strides)) - (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_query_boxes.diminfo[1].strides))) + 1.0) * (((*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_query_boxes.diminfo[1].strides)) - (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_query_boxes.diminfo[1].strides))) + 1.0)); + + /* "utils/bbox.pyx":131 + * (query_boxes[k, 3] - query_boxes[k, 1] + 1) + * ) + * for n in range(N): # <<<<<<<<<<<<<< + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - + */ + __pyx_t_17 = __pyx_v_N; + for (__pyx_t_18 = 0; __pyx_t_18 < __pyx_t_17; __pyx_t_18+=1) { + __pyx_v_n = __pyx_t_18; + + /* "utils/bbox.pyx":133 + * for n in range(N): + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - # <<<<<<<<<<<<<< + * max(boxes[n, 0], query_boxes[k, 0]) + 1 + * ) + */ + __pyx_t_19 = __pyx_v_k; + __pyx_t_20 = 2; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_19 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_20 < 0) { + __pyx_t_20 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_20 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_20 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_22 = __pyx_v_n; + __pyx_t_23 = 2; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_22 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_23 < 0) { + __pyx_t_23 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_23 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_23 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_24 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_21 < __pyx_t_24) != 0)) { + __pyx_t_25 = __pyx_t_21; + } else { + __pyx_t_25 = __pyx_t_24; + } + + /* "utils/bbox.pyx":134 + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - + * max(boxes[n, 0], query_boxes[k, 0]) + 1 # <<<<<<<<<<<<<< + * ) + * if iw > 0: + */ + __pyx_t_26 = __pyx_v_k; + __pyx_t_27 = 0; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_26 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_27 < 0) { + __pyx_t_27 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_27 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_27 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_21 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_27, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_28 = __pyx_v_n; + __pyx_t_29 = 0; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_28 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_29 < 0) { + __pyx_t_29 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_29 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_29 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_24 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_28, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_29, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_21 > __pyx_t_24) != 0)) { + __pyx_t_30 = __pyx_t_21; + } else { + __pyx_t_30 = __pyx_t_24; + } + + /* "utils/bbox.pyx":133 + * for n in range(N): + * iw = ( + * min(boxes[n, 2], query_boxes[k, 2]) - # <<<<<<<<<<<<<< + * max(boxes[n, 0], query_boxes[k, 0]) + 1 + * ) + */ + __pyx_v_iw = ((__pyx_t_25 - __pyx_t_30) + 1.0); + + /* "utils/bbox.pyx":136 + * max(boxes[n, 0], query_boxes[k, 0]) + 1 + * ) + * if iw > 0: # <<<<<<<<<<<<<< + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - + */ + __pyx_t_31 = ((__pyx_v_iw > 0.0) != 0); + if (__pyx_t_31) { + + /* "utils/bbox.pyx":138 + * if iw > 0: + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - # <<<<<<<<<<<<<< + * max(boxes[n, 1], query_boxes[k, 1]) + 1 + * ) + */ + __pyx_t_32 = __pyx_v_k; + __pyx_t_33 = 3; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_32 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_33 < 0) { + __pyx_t_33 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_33 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_33 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_30 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_32, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_33, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_34 = __pyx_v_n; + __pyx_t_35 = 3; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_34 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_35 < 0) { + __pyx_t_35 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_35 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_35 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_25 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_34, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_35, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_30 < __pyx_t_25) != 0)) { + __pyx_t_21 = __pyx_t_30; + } else { + __pyx_t_21 = __pyx_t_25; + } + + /* "utils/bbox.pyx":139 + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - + * max(boxes[n, 1], query_boxes[k, 1]) + 1 # <<<<<<<<<<<<<< + * ) + * if ih > 0: + */ + __pyx_t_36 = __pyx_v_k; + __pyx_t_37 = 1; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_36 >= (size_t)__pyx_pybuffernd_query_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_37 < 0) { + __pyx_t_37 += __pyx_pybuffernd_query_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_37 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_37 >= __pyx_pybuffernd_query_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_30 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_query_boxes.rcbuffer->pybuffer.buf, __pyx_t_36, __pyx_pybuffernd_query_boxes.diminfo[0].strides, __pyx_t_37, __pyx_pybuffernd_query_boxes.diminfo[1].strides)); + __pyx_t_38 = __pyx_v_n; + __pyx_t_39 = 1; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_38 >= (size_t)__pyx_pybuffernd_boxes.diminfo[0].shape)) __pyx_t_10 = 0; + if (__pyx_t_39 < 0) { + __pyx_t_39 += __pyx_pybuffernd_boxes.diminfo[1].shape; + if (unlikely(__pyx_t_39 < 0)) __pyx_t_10 = 1; + } else if (unlikely(__pyx_t_39 >= __pyx_pybuffernd_boxes.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_25 = (*__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_boxes.rcbuffer->pybuffer.buf, __pyx_t_38, __pyx_pybuffernd_boxes.diminfo[0].strides, __pyx_t_39, __pyx_pybuffernd_boxes.diminfo[1].strides)); + if (((__pyx_t_30 > __pyx_t_25) != 0)) { + __pyx_t_24 = __pyx_t_30; + } else { + __pyx_t_24 = __pyx_t_25; + } + + /* "utils/bbox.pyx":138 + * if iw > 0: + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - # <<<<<<<<<<<<<< + * max(boxes[n, 1], query_boxes[k, 1]) + 1 + * ) + */ + __pyx_v_ih = ((__pyx_t_21 - __pyx_t_24) + 1.0); + + /* "utils/bbox.pyx":141 + * max(boxes[n, 1], query_boxes[k, 1]) + 1 + * ) + * if ih > 0: # <<<<<<<<<<<<<< + * ua = float(box_area) + * overlaps[n, k] = iw * ih / ua + */ + __pyx_t_31 = ((__pyx_v_ih > 0.0) != 0); + if (__pyx_t_31) { + + /* "utils/bbox.pyx":142 + * ) + * if ih > 0: + * ua = float(box_area) # <<<<<<<<<<<<<< + * overlaps[n, k] = iw * ih / ua + * return overlaps + */ + __pyx_v_ua = ((double)__pyx_v_box_area); + + /* "utils/bbox.pyx":143 + * if ih > 0: + * ua = float(box_area) + * overlaps[n, k] = iw * ih / ua # <<<<<<<<<<<<<< + * return overlaps + */ + __pyx_t_24 = (__pyx_v_iw * __pyx_v_ih); + if (unlikely(__pyx_v_ua == 0)) { + PyErr_SetString(PyExc_ZeroDivisionError, "float division"); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_40 = __pyx_v_n; + __pyx_t_41 = __pyx_v_k; + __pyx_t_10 = -1; + if (unlikely(__pyx_t_40 >= (size_t)__pyx_pybuffernd_overlaps.diminfo[0].shape)) __pyx_t_10 = 0; + if (unlikely(__pyx_t_41 >= (size_t)__pyx_pybuffernd_overlaps.diminfo[1].shape)) __pyx_t_10 = 1; + if (unlikely(__pyx_t_10 != -1)) { + __Pyx_RaiseBufferIndexError(__pyx_t_10); + {__pyx_filename = __pyx_f[0]; __pyx_lineno = 143; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + *__Pyx_BufPtrStrided2d(__pyx_t_5utils_11cython_bbox_DTYPE_t *, __pyx_pybuffernd_overlaps.rcbuffer->pybuffer.buf, __pyx_t_40, __pyx_pybuffernd_overlaps.diminfo[0].strides, __pyx_t_41, __pyx_pybuffernd_overlaps.diminfo[1].strides) = (__pyx_t_24 / __pyx_v_ua); + + /* "utils/bbox.pyx":141 + * max(boxes[n, 1], query_boxes[k, 1]) + 1 + * ) + * if ih > 0: # <<<<<<<<<<<<<< + * ua = float(box_area) + * overlaps[n, k] = iw * ih / ua + */ + } + + /* "utils/bbox.pyx":136 + * max(boxes[n, 0], query_boxes[k, 0]) + 1 + * ) + * if iw > 0: # <<<<<<<<<<<<<< + * ih = ( + * min(boxes[n, 3], query_boxes[k, 3]) - + */ + } + } + } + + /* "utils/bbox.pyx":144 + * ua = float(box_area) + * overlaps[n, k] = iw * ih / ua + * return overlaps # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_overlaps)); + __pyx_r = ((PyObject *)__pyx_v_overlaps); + goto __pyx_L0; + + /* "utils/bbox.pyx":108 + * return overlaps + * + * def bbox_overlaps_self( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; + __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_boxes.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_overlaps.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_query_boxes.rcbuffer->pybuffer); + __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} + __Pyx_AddTraceback("utils.cython_bbox.bbox_overlaps_self", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + goto __pyx_L2; + __pyx_L0:; + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_boxes.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_overlaps.rcbuffer->pybuffer); + __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_query_boxes.rcbuffer->pybuffer); + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_overlaps); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":197 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fullfill the PEP. + */ + +/* Python wrapper */ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ +static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); + __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { + int __pyx_v_copy_shape; + int __pyx_v_i; + int __pyx_v_ndim; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + int __pyx_v_t; + char *__pyx_v_f; + PyArray_Descr *__pyx_v_descr = 0; + int __pyx_v_offset; + int __pyx_v_hasfields; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + char *__pyx_t_7; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__getbuffer__", 0); + if (__pyx_v_info != NULL) { + __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(__pyx_v_info->obj); + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":203 + * # of flags + * + * if info == NULL: return # <<<<<<<<<<<<<< + * + * cdef int copy_shape, i, ndim + */ + __pyx_t_1 = ((__pyx_v_info == NULL) != 0); + if (__pyx_t_1) { + __pyx_r = 0; + goto __pyx_L0; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":206 + * + * cdef int copy_shape, i, ndim + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + */ + __pyx_v_endian_detector = 1; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":207 + * cdef int copy_shape, i, ndim + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * + * ndim = PyArray_NDIM(self) + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":209 + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * + * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":211 + * ndim = PyArray_NDIM(self) + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * copy_shape = 1 + * else: + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":212 + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * copy_shape = 1 # <<<<<<<<<<<<<< + * else: + * copy_shape = 0 + */ + __pyx_v_copy_shape = 1; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":211 + * ndim = PyArray_NDIM(self) + * + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * copy_shape = 1 + * else: + */ + goto __pyx_L4; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":214 + * copy_shape = 1 + * else: + * copy_shape = 0 # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + */ + /*else*/ { + __pyx_v_copy_shape = 0; + } + __pyx_L4:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":216 + * copy_shape = 0 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L6_bool_binop_done; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":217 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not C contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L6_bool_binop_done:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":216 + * copy_shape = 0 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + if (__pyx_t_1) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":218 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":216 + * copy_shape = 0 + * + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") + */ + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":220 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + __pyx_t_2 = (((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L9_bool_binop_done; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":221 + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< + * raise ValueError(u"ndarray is not Fortran contiguous") + * + */ + __pyx_t_2 = ((!(PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS) != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L9_bool_binop_done:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":220 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + if (__pyx_t_1) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":222 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":220 + * raise ValueError(u"ndarray is not C contiguous") + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") + */ + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":224 + * raise ValueError(u"ndarray is not Fortran contiguous") + * + * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< + * info.ndim = ndim + * if copy_shape: + */ + __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":225 + * + * info.buf = PyArray_DATA(self) + * info.ndim = ndim # <<<<<<<<<<<<<< + * if copy_shape: + * # Allocate new buffer for strides and shape info. + */ + __pyx_v_info->ndim = __pyx_v_ndim; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":226 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if copy_shape: # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + __pyx_t_1 = (__pyx_v_copy_shape != 0); + if (__pyx_t_1) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":229 + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) # <<<<<<<<<<<<<< + * info.shape = info.strides + ndim + * for i in range(ndim): + */ + __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2))); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":230 + * # This is allocated as one block, strides first. + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) + * info.shape = info.strides + ndim # <<<<<<<<<<<<<< + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + */ + __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":231 + * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) + * info.shape = info.strides + ndim + * for i in range(ndim): # <<<<<<<<<<<<<< + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] + */ + __pyx_t_4 = __pyx_v_ndim; + for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { + __pyx_v_i = __pyx_t_5; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":232 + * info.shape = info.strides + ndim + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + */ + (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":233 + * for i in range(ndim): + * info.strides[i] = PyArray_STRIDES(self)[i] + * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< + * else: + * info.strides = PyArray_STRIDES(self) + */ + (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":226 + * info.buf = PyArray_DATA(self) + * info.ndim = ndim + * if copy_shape: # <<<<<<<<<<<<<< + * # Allocate new buffer for strides and shape info. + * # This is allocated as one block, strides first. + */ + goto __pyx_L11; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":235 + * info.shape[i] = PyArray_DIMS(self)[i] + * else: + * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + */ + /*else*/ { + __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":236 + * else: + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + */ + __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self)); + } + __pyx_L11:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":237 + * info.strides = PyArray_STRIDES(self) + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL # <<<<<<<<<<<<<< + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) + */ + __pyx_v_info->suboffsets = NULL; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":238 + * info.shape = PyArray_DIMS(self) + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< + * info.readonly = not PyArray_ISWRITEABLE(self) + * + */ + __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":239 + * info.suboffsets = NULL + * info.itemsize = PyArray_ITEMSIZE(self) + * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< + * + * cdef int t + */ + __pyx_v_info->readonly = (!(PyArray_ISWRITEABLE(__pyx_v_self) != 0)); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":242 + * + * cdef int t + * cdef char* f = NULL # <<<<<<<<<<<<<< + * cdef dtype descr = self.descr + * cdef int offset + */ + __pyx_v_f = NULL; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":243 + * cdef int t + * cdef char* f = NULL + * cdef dtype descr = self.descr # <<<<<<<<<<<<<< + * cdef int offset + * + */ + __pyx_t_3 = ((PyObject *)__pyx_v_self->descr); + __Pyx_INCREF(__pyx_t_3); + __pyx_v_descr = ((PyArray_Descr *)__pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":246 + * cdef int offset + * + * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< + * + * if not hasfields and not copy_shape: + */ + __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":248 + * cdef bint hasfields = PyDataType_HASFIELDS(descr) + * + * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< + * # do not call releasebuffer + * info.obj = None + */ + __pyx_t_2 = ((!(__pyx_v_hasfields != 0)) != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L15_bool_binop_done; + } + __pyx_t_2 = ((!(__pyx_v_copy_shape != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L15_bool_binop_done:; + if (__pyx_t_1) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":250 + * if not hasfields and not copy_shape: + * # do not call releasebuffer + * info.obj = None # <<<<<<<<<<<<<< + * else: + * # need to call releasebuffer + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = Py_None; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":248 + * cdef bint hasfields = PyDataType_HASFIELDS(descr) + * + * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< + * # do not call releasebuffer + * info.obj = None + */ + goto __pyx_L14; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":253 + * else: + * # need to call releasebuffer + * info.obj = self # <<<<<<<<<<<<<< + * + * if not hasfields: + */ + /*else*/ { + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); + __pyx_v_info->obj = ((PyObject *)__pyx_v_self); + } + __pyx_L14:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":255 + * info.obj = self + * + * if not hasfields: # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + __pyx_t_1 = ((!(__pyx_v_hasfields != 0)) != 0); + if (__pyx_t_1) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":256 + * + * if not hasfields: + * t = descr.type_num # <<<<<<<<<<<<<< + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + */ + __pyx_t_4 = __pyx_v_descr->type_num; + __pyx_v_t = __pyx_t_4; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":257 + * if not hasfields: + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '>') != 0); + if (!__pyx_t_2) { + goto __pyx_L20_next_or; + } else { + } + __pyx_t_2 = (__pyx_v_little_endian != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L19_bool_binop_done; + } + __pyx_L20_next_or:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":258 + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + */ + __pyx_t_2 = ((__pyx_v_descr->byteorder == '<') != 0); + if (__pyx_t_2) { + } else { + __pyx_t_1 = __pyx_t_2; + goto __pyx_L19_bool_binop_done; + } + __pyx_t_2 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L19_bool_binop_done:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":257 + * if not hasfields: + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (__pyx_t_1) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":259 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":257 + * if not hasfields: + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":260 + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + */ + switch (__pyx_v_t) { + case NPY_BYTE: + __pyx_v_f = __pyx_k_b; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":261 + * raise ValueError(u"Non-native byte order not supported") + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + */ + case NPY_UBYTE: + __pyx_v_f = __pyx_k_B; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":262 + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + */ + case NPY_SHORT: + __pyx_v_f = __pyx_k_h; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":263 + * elif t == NPY_UBYTE: f = "B" + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + */ + case NPY_USHORT: + __pyx_v_f = __pyx_k_H; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":264 + * elif t == NPY_SHORT: f = "h" + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + */ + case NPY_INT: + __pyx_v_f = __pyx_k_i; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":265 + * elif t == NPY_USHORT: f = "H" + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + */ + case NPY_UINT: + __pyx_v_f = __pyx_k_I; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":266 + * elif t == NPY_INT: f = "i" + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + */ + case NPY_LONG: + __pyx_v_f = __pyx_k_l; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":267 + * elif t == NPY_UINT: f = "I" + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + */ + case NPY_ULONG: + __pyx_v_f = __pyx_k_L; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":268 + * elif t == NPY_LONG: f = "l" + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + */ + case NPY_LONGLONG: + __pyx_v_f = __pyx_k_q; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":269 + * elif t == NPY_ULONG: f = "L" + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + */ + case NPY_ULONGLONG: + __pyx_v_f = __pyx_k_Q; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":270 + * elif t == NPY_LONGLONG: f = "q" + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + */ + case NPY_FLOAT: + __pyx_v_f = __pyx_k_f; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":271 + * elif t == NPY_ULONGLONG: f = "Q" + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + */ + case NPY_DOUBLE: + __pyx_v_f = __pyx_k_d; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":272 + * elif t == NPY_FLOAT: f = "f" + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + */ + case NPY_LONGDOUBLE: + __pyx_v_f = __pyx_k_g; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":273 + * elif t == NPY_DOUBLE: f = "d" + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + */ + case NPY_CFLOAT: + __pyx_v_f = __pyx_k_Zf; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":274 + * elif t == NPY_LONGDOUBLE: f = "g" + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" + */ + case NPY_CDOUBLE: + __pyx_v_f = __pyx_k_Zd; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":275 + * elif t == NPY_CFLOAT: f = "Zf" + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f = "O" + * else: + */ + case NPY_CLONGDOUBLE: + __pyx_v_f = __pyx_k_Zg; + break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":276 + * elif t == NPY_CDOUBLE: f = "Zd" + * elif t == NPY_CLONGDOUBLE: f = "Zg" + * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + case NPY_OBJECT: + __pyx_v_f = __pyx_k_O; + break; + default: + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":278 + * elif t == NPY_OBJECT: f = "O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * info.format = f + * return + */ + __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_6, 0, 0, 0); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 278; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + break; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":279 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f # <<<<<<<<<<<<<< + * return + * else: + */ + __pyx_v_info->format = __pyx_v_f; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":280 + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * info.format = f + * return # <<<<<<<<<<<<<< + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":255 + * info.obj = self + * + * if not hasfields: # <<<<<<<<<<<<<< + * t = descr.type_num + * if ((descr.byteorder == c'>' and little_endian) or + */ + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":282 + * return + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + */ + /*else*/ { + __pyx_v_info->format = ((char *)malloc(0xFF)); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":283 + * else: + * info.format = stdlib.malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, + */ + (__pyx_v_info->format[0]) = '^'; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":284 + * info.format = stdlib.malloc(_buffer_format_string_len) + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 # <<<<<<<<<<<<<< + * f = _util_dtypestring(descr, info.format + 1, + * info.format + _buffer_format_string_len, + */ + __pyx_v_offset = 0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":285 + * info.format[0] = c'^' # Native data types, manual alignment + * offset = 0 + * f = _util_dtypestring(descr, info.format + 1, # <<<<<<<<<<<<<< + * info.format + _buffer_format_string_len, + * &offset) + */ + __pyx_t_7 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 0xFF), (&__pyx_v_offset)); if (unlikely(__pyx_t_7 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_f = __pyx_t_7; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":288 + * info.format + _buffer_format_string_len, + * &offset) + * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + */ + (__pyx_v_f[0]) = '\x00'; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":197 + * # experimental exception made for __getbuffer__ and __releasebuffer__ + * # -- the details of this may change. + * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< + * # This implementation of getbuffer is geared towards Cython + * # requirements, and does not yet fullfill the PEP. + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) { + __Pyx_GOTREF(__pyx_v_info->obj); + __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL; + } + goto __pyx_L2; + __pyx_L0:; + if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) { + __Pyx_GOTREF(Py_None); + __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL; + } + __pyx_L2:; + __Pyx_XDECREF((PyObject *)__pyx_v_descr); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":290 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + */ + +/* Python wrapper */ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ +static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0); + __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("__releasebuffer__", 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":291 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + __pyx_t_1 = (PyArray_HASFIELDS(__pyx_v_self) != 0); + if (__pyx_t_1) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":292 + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) # <<<<<<<<<<<<<< + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * stdlib.free(info.strides) + */ + free(__pyx_v_info->format); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":291 + * + * def __releasebuffer__(ndarray self, Py_buffer* info): + * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + */ + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":293 + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * stdlib.free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + __pyx_t_1 = (((sizeof(npy_intp)) != (sizeof(Py_ssize_t))) != 0); + if (__pyx_t_1) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":294 + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): + * stdlib.free(info.strides) # <<<<<<<<<<<<<< + * # info.shape was stored after info.strides in the same block + * + */ + free(__pyx_v_info->strides); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":293 + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< + * stdlib.free(info.strides) + * # info.shape was stored after info.strides in the same block + */ + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":290 + * f[0] = c'\0' # Terminate format string + * + * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< + * if PyArray_HASFIELDS(self): + * stdlib.free(info.format) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":770 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":771 + * + * cdef inline object PyArray_MultiIterNew1(a): + * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew2(a, b): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 771; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":770 + * ctypedef npy_cdouble complex_t + * + * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(1, a) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":773 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":774 + * + * cdef inline object PyArray_MultiIterNew2(a, b): + * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 774; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":773 + * return PyArray_MultiIterNew(1, a) + * + * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(2, a, b) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":776 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":777 + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): + * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 777; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":776 + * return PyArray_MultiIterNew(2, a, b) + * + * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(3, a, b, c) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":779 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":780 + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): + * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":779 + * return PyArray_MultiIterNew(3, a, b, c) + * + * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(4, a, b, c, d) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":782 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":783 + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): + * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":782 + * return PyArray_MultiIterNew(4, a, b, c, d) + * + * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":785 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + +static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { + PyArray_Descr *__pyx_v_child = 0; + int __pyx_v_endian_detector; + int __pyx_v_little_endian; + PyObject *__pyx_v_fields = 0; + PyObject *__pyx_v_childname = NULL; + PyObject *__pyx_v_new_offset = NULL; + PyObject *__pyx_v_t = NULL; + char *__pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + long __pyx_t_8; + char *__pyx_t_9; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_util_dtypestring", 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":790 + * + * cdef dtype child + * cdef int endian_detector = 1 # <<<<<<<<<<<<<< + * cdef bint little_endian = ((&endian_detector)[0] != 0) + * cdef tuple fields + */ + __pyx_v_endian_detector = 1; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":791 + * cdef dtype child + * cdef int endian_detector = 1 + * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< + * cdef tuple fields + * + */ + __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":794 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + if (unlikely(__pyx_v_descr->names == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_1 = __pyx_v_descr->names; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + for (;;) { + if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + #endif + __Pyx_XDECREF_SET(__pyx_v_childname, __pyx_t_3); + __pyx_t_3 = 0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":795 + * + * for childname in descr.names: + * fields = descr.fields[childname] # <<<<<<<<<<<<<< + * child, new_offset = fields + * + */ + if (unlikely(__pyx_v_descr->fields == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (unlikely(__pyx_t_3 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_XDECREF_SET(__pyx_v_fields, ((PyObject*)__pyx_t_3)); + __pyx_t_3 = 0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":796 + * for childname in descr.names: + * fields = descr.fields[childname] + * child, new_offset = fields # <<<<<<<<<<<<<< + * + * if (end - f) - (new_offset - offset[0]) < 15: + */ + if (likely(__pyx_v_fields != Py_None)) { + PyObject* sequence = __pyx_v_fields; + #if CYTHON_COMPILING_IN_CPYTHON + Py_ssize_t size = Py_SIZE(sequence); + #else + Py_ssize_t size = PySequence_Size(sequence); + #endif + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + #if CYTHON_COMPILING_IN_CPYTHON + __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + #else + __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + #endif + } else { + __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_XDECREF_SET(__pyx_v_child, ((PyArray_Descr *)__pyx_t_3)); + __pyx_t_3 = 0; + __Pyx_XDECREF_SET(__pyx_v_new_offset, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":798 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + __pyx_t_4 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_3); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = ((((__pyx_v_end - __pyx_v_f) - ((int)__pyx_t_5)) < 15) != 0); + if (__pyx_t_6) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":799 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":798 + * child, new_offset = fields + * + * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + */ + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":801 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '>') != 0); + if (!__pyx_t_7) { + goto __pyx_L8_next_or; + } else { + } + __pyx_t_7 = (__pyx_v_little_endian != 0); + if (!__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_L8_next_or:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":802 + * + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< + * raise ValueError(u"Non-native byte order not supported") + * # One could encode it in the format string and have Cython + */ + __pyx_t_7 = ((__pyx_v_child->byteorder == '<') != 0); + if (__pyx_t_7) { + } else { + __pyx_t_6 = __pyx_t_7; + goto __pyx_L7_bool_binop_done; + } + __pyx_t_7 = ((!(__pyx_v_little_endian != 0)) != 0); + __pyx_t_6 = __pyx_t_7; + __pyx_L7_bool_binop_done:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":801 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + if (__pyx_t_6) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":803 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":801 + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") + * + * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") + */ + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":813 + * + * # Output padding bytes + * while offset[0] < new_offset: # <<<<<<<<<<<<<< + * f[0] = 120 # "x"; pad byte + * f += 1 + */ + while (1) { + __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (!__pyx_t_6) break; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":814 + * # Output padding bytes + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< + * f += 1 + * offset[0] += 1 + */ + (__pyx_v_f[0]) = 0x78; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":815 + * while offset[0] < new_offset: + * f[0] = 120 # "x"; pad byte + * f += 1 # <<<<<<<<<<<<<< + * offset[0] += 1 + * + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":816 + * f[0] = 120 # "x"; pad byte + * f += 1 + * offset[0] += 1 # <<<<<<<<<<<<<< + * + * offset[0] += child.itemsize + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + 1); + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":818 + * offset[0] += 1 + * + * offset[0] += child.itemsize # <<<<<<<<<<<<<< + * + * if not PyDataType_HASFIELDS(child): + */ + __pyx_t_8 = 0; + (__pyx_v_offset[__pyx_t_8]) = ((__pyx_v_offset[__pyx_t_8]) + __pyx_v_child->elsize); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":820 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + __pyx_t_6 = ((!(PyDataType_HASFIELDS(__pyx_v_child) != 0)) != 0); + if (__pyx_t_6) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":821 + * + * if not PyDataType_HASFIELDS(child): + * t = child.type_num # <<<<<<<<<<<<<< + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") + */ + __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_child->type_num); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_XDECREF_SET(__pyx_v_t, __pyx_t_4); + __pyx_t_4 = 0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":822 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + __pyx_t_6 = (((__pyx_v_end - __pyx_v_f) < 5) != 0); + if (__pyx_t_6) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":823 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":822 + * if not PyDataType_HASFIELDS(child): + * t = child.type_num + * if end - f < 5: # <<<<<<<<<<<<<< + * raise RuntimeError(u"Format string allocated too short.") + * + */ + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":826 + * + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_BYTE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 98; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":827 + * # Until ticket #99 is fixed, use integers to avoid warnings + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UBYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 66; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":828 + * if t == NPY_BYTE: f[0] = 98 #"b" + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_SHORT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x68; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":829 + * elif t == NPY_UBYTE: f[0] = 66 #"B" + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_USHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 72; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":830 + * elif t == NPY_SHORT: f[0] = 104 #"h" + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_INT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x69; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":831 + * elif t == NPY_USHORT: f[0] = 72 #"H" + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_UINT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 73; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":832 + * elif t == NPY_INT: f[0] = 105 #"i" + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x6C; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":833 + * elif t == NPY_UINT: f[0] = 73 #"I" + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 76; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":834 + * elif t == NPY_LONG: f[0] = 108 #"l" + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGLONG); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x71; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":835 + * elif t == NPY_ULONG: f[0] = 76 #"L" + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_ULONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 81; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":836 + * elif t == NPY_LONGLONG: f[0] = 113 #"q" + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_FLOAT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x66; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":837 + * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_DOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x64; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":838 + * elif t == NPY_FLOAT: f[0] = 102 #"f" + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 0x67; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":839 + * elif t == NPY_DOUBLE: f[0] = 100 #"d" + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CFLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x66; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":840 + * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CDOUBLE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x64; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":841 + * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + */ + __pyx_t_3 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 90; + (__pyx_v_f[1]) = 0x67; + __pyx_v_f = (__pyx_v_f + 1); + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":842 + * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd + * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg + * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + */ + __pyx_t_4 = __Pyx_PyInt_From_enum__NPY_TYPES(NPY_OBJECT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + if (__pyx_t_6) { + (__pyx_v_f[0]) = 79; + goto __pyx_L15; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":844 + * elif t == NPY_OBJECT: f[0] = 79 #"O" + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< + * f += 1 + * else: + */ + /*else*/ { + __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_v_t); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); + __pyx_t_3 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + __pyx_L15:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":845 + * else: + * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) + * f += 1 # <<<<<<<<<<<<<< + * else: + * # Cython ignores struct boundary information ("T{...}"), + */ + __pyx_v_f = (__pyx_v_f + 1); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":820 + * offset[0] += child.itemsize + * + * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< + * t = child.type_num + * if end - f < 5: + */ + goto __pyx_L13; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":849 + * # Cython ignores struct boundary information ("T{...}"), + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< + * return f + * + */ + /*else*/ { + __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_v_f = __pyx_t_9; + } + __pyx_L13:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":794 + * cdef tuple fields + * + * for childname in descr.names: # <<<<<<<<<<<<<< + * fields = descr.fields[childname] + * child, new_offset = fields + */ + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":850 + * # so don't output it + * f = _util_dtypestring(child, f, end, offset) + * return f # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_v_f; + goto __pyx_L0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":785 + * return PyArray_MultiIterNew(5, a, b, c, d, e) + * + * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< + * # Recursive utility function used in __getbuffer__ to get format + * # string. The new location in the format string is returned. + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_child); + __Pyx_XDECREF(__pyx_v_fields); + __Pyx_XDECREF(__pyx_v_childname); + __Pyx_XDECREF(__pyx_v_new_offset); + __Pyx_XDECREF(__pyx_v_t); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":966 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + +static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { + PyObject *__pyx_v_baseptr; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + __Pyx_RefNannySetupContext("set_array_base", 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":968 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + __pyx_t_1 = (__pyx_v_base == Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":969 + * cdef PyObject* baseptr + * if base is None: + * baseptr = NULL # <<<<<<<<<<<<<< + * else: + * Py_INCREF(base) # important to do this before decref below! + */ + __pyx_v_baseptr = NULL; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":968 + * cdef inline void set_array_base(ndarray arr, object base): + * cdef PyObject* baseptr + * if base is None: # <<<<<<<<<<<<<< + * baseptr = NULL + * else: + */ + goto __pyx_L3; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":971 + * baseptr = NULL + * else: + * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< + * baseptr = base + * Py_XDECREF(arr.base) + */ + /*else*/ { + Py_INCREF(__pyx_v_base); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":972 + * else: + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base # <<<<<<<<<<<<<< + * Py_XDECREF(arr.base) + * arr.base = baseptr + */ + __pyx_v_baseptr = ((PyObject *)__pyx_v_base); + } + __pyx_L3:; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":973 + * Py_INCREF(base) # important to do this before decref below! + * baseptr = base + * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< + * arr.base = baseptr + * + */ + Py_XDECREF(__pyx_v_arr->base); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":974 + * baseptr = base + * Py_XDECREF(arr.base) + * arr.base = baseptr # <<<<<<<<<<<<<< + * + * cdef inline object get_array_base(ndarray arr): + */ + __pyx_v_arr->base = __pyx_v_baseptr; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":966 + * + * + * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< + * cdef PyObject* baseptr + * if base is None: + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":976 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + +static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("get_array_base", 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + __pyx_t_1 = ((__pyx_v_arr->base == NULL) != 0); + if (__pyx_t_1) { + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":978 + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: + * return None # <<<<<<<<<<<<<< + * else: + * return arr.base + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(Py_None); + __pyx_r = Py_None; + goto __pyx_L0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":977 + * + * cdef inline object get_array_base(ndarray arr): + * if arr.base is NULL: # <<<<<<<<<<<<<< + * return None + * else: + */ + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":980 + * return None + * else: + * return arr.base # <<<<<<<<<<<<<< + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); + __pyx_r = ((PyObject *)__pyx_v_arr->base); + goto __pyx_L0; + } + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":976 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef __pyx_moduledef = { + #if PY_VERSION_HEX < 0x03020000 + { PyObject_HEAD_INIT(NULL) NULL, 0, NULL }, + #else + PyModuleDef_HEAD_INIT, + #endif + "cython_bbox", + 0, /* m_doc */ + -1, /* m_size */ + __pyx_methods /* m_methods */, + NULL, /* m_reload */ + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_DTYPE, __pyx_k_DTYPE, sizeof(__pyx_k_DTYPE), 0, 0, 1, 1}, + {&__pyx_kp_u_Format_string_allocated_too_shor, __pyx_k_Format_string_allocated_too_shor, sizeof(__pyx_k_Format_string_allocated_too_shor), 0, 1, 0, 0}, + {&__pyx_kp_u_Format_string_allocated_too_shor_2, __pyx_k_Format_string_allocated_too_shor_2, sizeof(__pyx_k_Format_string_allocated_too_shor_2), 0, 1, 0, 0}, + {&__pyx_n_s_K, __pyx_k_K, sizeof(__pyx_k_K), 0, 0, 1, 1}, + {&__pyx_n_s_N, __pyx_k_N, sizeof(__pyx_k_N), 0, 0, 1, 1}, + {&__pyx_kp_u_Non_native_byte_order_not_suppor, __pyx_k_Non_native_byte_order_not_suppor, sizeof(__pyx_k_Non_native_byte_order_not_suppor), 0, 1, 0, 0}, + {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_n_s_bbox_overlaps, __pyx_k_bbox_overlaps, sizeof(__pyx_k_bbox_overlaps), 0, 0, 1, 1}, + {&__pyx_n_s_bbox_overlaps_float, __pyx_k_bbox_overlaps_float, sizeof(__pyx_k_bbox_overlaps_float), 0, 0, 1, 1}, + {&__pyx_n_s_bbox_overlaps_self, __pyx_k_bbox_overlaps_self, sizeof(__pyx_k_bbox_overlaps_self), 0, 0, 1, 1}, + {&__pyx_n_s_box_area, __pyx_k_box_area, sizeof(__pyx_k_box_area), 0, 0, 1, 1}, + {&__pyx_n_s_boxes, __pyx_k_boxes, sizeof(__pyx_k_boxes), 0, 0, 1, 1}, + {&__pyx_n_s_dtype, __pyx_k_dtype, sizeof(__pyx_k_dtype), 0, 0, 1, 1}, + {&__pyx_n_s_float, __pyx_k_float, sizeof(__pyx_k_float), 0, 0, 1, 1}, + {&__pyx_n_s_ih, __pyx_k_ih, sizeof(__pyx_k_ih), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_iw, __pyx_k_iw, sizeof(__pyx_k_iw), 0, 0, 1, 1}, + {&__pyx_n_s_k, __pyx_k_k, sizeof(__pyx_k_k), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1}, + {&__pyx_kp_u_ndarray_is_not_C_contiguous, __pyx_k_ndarray_is_not_C_contiguous, sizeof(__pyx_k_ndarray_is_not_C_contiguous), 0, 1, 0, 0}, + {&__pyx_kp_u_ndarray_is_not_Fortran_contiguou, __pyx_k_ndarray_is_not_Fortran_contiguou, sizeof(__pyx_k_ndarray_is_not_Fortran_contiguou), 0, 1, 0, 0}, + {&__pyx_n_s_np, __pyx_k_np, sizeof(__pyx_k_np), 0, 0, 1, 1}, + {&__pyx_n_s_numpy, __pyx_k_numpy, sizeof(__pyx_k_numpy), 0, 0, 1, 1}, + {&__pyx_n_s_overlaps, __pyx_k_overlaps, sizeof(__pyx_k_overlaps), 0, 0, 1, 1}, + {&__pyx_n_s_query_boxes, __pyx_k_query_boxes, sizeof(__pyx_k_query_boxes), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_ua, __pyx_k_ua, sizeof(__pyx_k_ua), 0, 0, 1, 1}, + {&__pyx_kp_u_unknown_dtype_code_in_numpy_pxd, __pyx_k_unknown_dtype_code_in_numpy_pxd, sizeof(__pyx_k_unknown_dtype_code_in_numpy_pxd), 0, 1, 0, 0}, + {&__pyx_kp_s_unsullied_sharefs_lizeming_work, __pyx_k_unsullied_sharefs_lizeming_work, sizeof(__pyx_k_unsullied_sharefs_lizeming_work), 0, 0, 1, 0}, + {&__pyx_n_s_utils_cython_bbox, __pyx_k_utils_cython_bbox, sizeof(__pyx_k_utils_cython_bbox), 0, 0, 1, 1}, + {&__pyx_n_s_zeros, __pyx_k_zeros, sizeof(__pyx_k_zeros), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + return 0; + __pyx_L1_error:; + return -1; +} + +static int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":218 + * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): + * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< + * + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + */ + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_C_contiguous); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 218; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":222 + * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) + * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): + * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< + * + * info.buf = PyArray_DATA(self) + */ + __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_u_ndarray_is_not_Fortran_contiguou); if (unlikely(!__pyx_tuple__2)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":259 + * if ((descr.byteorder == c'>' and little_endian) or + * (descr.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * if t == NPY_BYTE: f = "b" + * elif t == NPY_UBYTE: f = "B" + */ + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 259; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":799 + * + * if (end - f) - (new_offset - offset[0]) < 15: + * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< + * + * if ((child.byteorder == c'>' and little_endian) or + */ + __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor); if (unlikely(!__pyx_tuple__4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":803 + * if ((child.byteorder == c'>' and little_endian) or + * (child.byteorder == c'<' and not little_endian)): + * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< + * # One could encode it in the format string and have Cython + * # complain instead, BUT: < and > in format strings also imply + */ + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_u_Non_native_byte_order_not_suppor); if (unlikely(!__pyx_tuple__5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":823 + * t = child.type_num + * if end - f < 5: + * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< + * + * # Until ticket #99 is fixed, use integers to avoid warnings + */ + __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_u_Format_string_allocated_too_shor_2); if (unlikely(!__pyx_tuple__6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__6); + __Pyx_GIVEREF(__pyx_tuple__6); + + /* "utils/bbox.pyx":15 + * ctypedef np.float_t DTYPE_t + * + * def bbox_overlaps_float( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + __pyx_tuple__7 = PyTuple_Pack(11, __pyx_n_s_boxes, __pyx_n_s_query_boxes, __pyx_n_s_N, __pyx_n_s_K, __pyx_n_s_overlaps, __pyx_n_s_iw, __pyx_n_s_ih, __pyx_n_s_box_area, __pyx_n_s_ua, __pyx_n_s_k, __pyx_n_s_n); if (unlikely(!__pyx_tuple__7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__7); + __Pyx_GIVEREF(__pyx_tuple__7); + __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(2, 0, 11, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_unsullied_sharefs_lizeming_work, __pyx_n_s_bbox_overlaps_float, 15, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "utils/bbox.pyx":66 + * return overlaps + * + * def bbox_overlaps( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + __pyx_tuple__9 = PyTuple_Pack(11, __pyx_n_s_boxes, __pyx_n_s_query_boxes, __pyx_n_s_N, __pyx_n_s_K, __pyx_n_s_overlaps, __pyx_n_s_iw, __pyx_n_s_ih, __pyx_n_s_box_area, __pyx_n_s_ua, __pyx_n_s_k, __pyx_n_s_n); if (unlikely(!__pyx_tuple__9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(2, 0, 11, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_unsullied_sharefs_lizeming_work, __pyx_n_s_bbox_overlaps, 66, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + + /* "utils/bbox.pyx":108 + * return overlaps + * + * def bbox_overlaps_self( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + __pyx_tuple__11 = PyTuple_Pack(11, __pyx_n_s_boxes, __pyx_n_s_query_boxes, __pyx_n_s_N, __pyx_n_s_K, __pyx_n_s_overlaps, __pyx_n_s_iw, __pyx_n_s_ih, __pyx_n_s_box_area, __pyx_n_s_ua, __pyx_n_s_k, __pyx_n_s_n); if (unlikely(!__pyx_tuple__11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); + __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(2, 0, 11, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__11, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_unsullied_sharefs_lizeming_work, __pyx_n_s_bbox_overlaps_self, 108, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + return 0; + __pyx_L1_error:; + return -1; +} + +#if PY_MAJOR_VERSION < 3 +PyMODINIT_FUNC initcython_bbox(void); /*proto*/ +PyMODINIT_FUNC initcython_bbox(void) +#else +PyMODINIT_FUNC PyInit_cython_bbox(void); /*proto*/ +PyMODINIT_FUNC PyInit_cython_bbox(void) +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_REFNANNY + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); + if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); + } + #endif + __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_cython_bbox(void)", 0); + if (__Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + #ifdef WITH_THREAD /* Python build with threading support? */ + PyEval_InitThreads(); + #endif + #endif + /*--- Module creation code ---*/ + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("cython_bbox", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #if CYTHON_COMPILING_IN_PYPY + Py_INCREF(__pyx_b); + #endif + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + if (__pyx_module_is_main_utils__cython_bbox) { + if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + if (!PyDict_GetItemString(modules, "utils.cython_bbox")) { + if (unlikely(PyDict_SetItemString(modules, "utils.cython_bbox", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Global init code ---*/ + /*--- Variable export code ---*/ + /*--- Function export code ---*/ + /*--- Type init code ---*/ + /*--- Type import code ---*/ + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", + #if CYTHON_COMPILING_IN_PYPY + sizeof(PyTypeObject), + #else + sizeof(PyHeapTypeObject), + #endif + 0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + /*--- Variable import code ---*/ + /*--- Function import code ---*/ + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + #endif + + /* "utils/bbox.pyx":9 + * + * cimport cython + * import numpy as np # <<<<<<<<<<<<<< + * cimport numpy as np + * + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "utils/bbox.pyx":12 + * cimport numpy as np + * + * DTYPE = np.float # <<<<<<<<<<<<<< + * ctypedef np.float_t DTYPE_t + * + */ + __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + if (PyDict_SetItem(__pyx_d, __pyx_n_s_DTYPE, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "utils/bbox.pyx":15 + * ctypedef np.float_t DTYPE_t + * + * def bbox_overlaps_float( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_5utils_11cython_bbox_1bbox_overlaps_float, NULL, __pyx_n_s_utils_cython_bbox); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_bbox_overlaps_float, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "utils/bbox.pyx":66 + * return overlaps + * + * def bbox_overlaps( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_5utils_11cython_bbox_3bbox_overlaps, NULL, __pyx_n_s_utils_cython_bbox); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_bbox_overlaps, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "utils/bbox.pyx":108 + * return overlaps + * + * def bbox_overlaps_self( # <<<<<<<<<<<<<< + * np.ndarray[DTYPE_t, ndim=2] boxes, + * np.ndarray[DTYPE_t, ndim=2] query_boxes): + */ + __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_5utils_11cython_bbox_5bbox_overlaps_self, NULL, __pyx_n_s_utils_cython_bbox); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_bbox_overlaps_self, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 108; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "utils/bbox.pyx":1 + * # -------------------------------------------------------- # <<<<<<<<<<<<<< + * # Fast R-CNN + * # Copyright (c) 2015 Microsoft + */ + __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "../../../../../../../usr/lib/python3/dist-packages/Cython/Includes/numpy/__init__.pxd":976 + * arr.base = baseptr + * + * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< + * if arr.base is NULL: + * return None + */ + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init utils.cython_bbox", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + Py_DECREF(__pyx_m); __pyx_m = 0; + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init utils.cython_bbox"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if PY_MAJOR_VERSION < 3 + return; + #else + return __pyx_m; + #endif +} + +/* --- Runtime support code --- */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule((char *)modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) { + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", + name, type->tp_name, Py_TYPE(obj)->tp_name); +} +static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, + const char *name, int exact) +{ + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (none_allowed && obj == Py_None) return 1; + else if (exact) { + if (likely(Py_TYPE(obj) == type)) return 1; + #if PY_MAJOR_VERSION == 2 + else if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(PyObject_TypeCheck(obj, type))) return 1; + } + __Pyx_RaiseArgumentTypeInvalid(name, obj, type); + return 0; +} + +static CYTHON_INLINE int __Pyx_IsLittleEndian(void) { + unsigned int n = 1; + return *(unsigned char*)(&n) != 0; +} +static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, + __Pyx_BufFmt_StackElem* stack, + __Pyx_TypeInfo* type) { + stack[0].field = &ctx->root; + stack[0].parent_offset = 0; + ctx->root.type = type; + ctx->root.name = "buffer dtype"; + ctx->root.offset = 0; + ctx->head = stack; + ctx->head->field = &ctx->root; + ctx->fmt_offset = 0; + ctx->head->parent_offset = 0; + ctx->new_packmode = '@'; + ctx->enc_packmode = '@'; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->is_complex = 0; + ctx->is_valid_array = 0; + ctx->struct_alignment = 0; + while (type->typegroup == 'S') { + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = 0; + type = type->fields->type; + } +} +static int __Pyx_BufFmt_ParseNumber(const char** ts) { + int count; + const char* t = *ts; + if (*t < '0' || *t > '9') { + return -1; + } else { + count = *t++ - '0'; + while (*t >= '0' && *t < '9') { + count *= 10; + count += *t++ - '0'; + } + } + *ts = t; + return count; +} +static int __Pyx_BufFmt_ExpectNumber(const char **ts) { + int number = __Pyx_BufFmt_ParseNumber(ts); + if (number == -1) + PyErr_Format(PyExc_ValueError,\ + "Does not understand character buffer dtype format string ('%c')", **ts); + return number; +} +static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { + PyErr_Format(PyExc_ValueError, + "Unexpected format string character: '%c'", ch); +} +static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { + switch (ch) { + case 'c': return "'char'"; + case 'b': return "'signed char'"; + case 'B': return "'unsigned char'"; + case 'h': return "'short'"; + case 'H': return "'unsigned short'"; + case 'i': return "'int'"; + case 'I': return "'unsigned int'"; + case 'l': return "'long'"; + case 'L': return "'unsigned long'"; + case 'q': return "'long long'"; + case 'Q': return "'unsigned long long'"; + case 'f': return (is_complex ? "'complex float'" : "'float'"); + case 'd': return (is_complex ? "'complex double'" : "'double'"); + case 'g': return (is_complex ? "'complex long double'" : "'long double'"); + case 'T': return "a struct"; + case 'O': return "Python object"; + case 'P': return "a pointer"; + case 's': case 'p': return "a string"; + case 0: return "end"; + default: return "unparseable format string"; + } +} +static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return 2; + case 'i': case 'I': case 'l': case 'L': return 4; + case 'q': case 'Q': return 8; + case 'f': return (is_complex ? 8 : 4); + case 'd': return (is_complex ? 16 : 8); + case 'g': { + PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); + return 0; + } + case 'O': case 'P': return sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { + switch (ch) { + case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(short); + case 'i': case 'I': return sizeof(int); + case 'l': case 'L': return sizeof(long); + #ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(PY_LONG_LONG); + #endif + case 'f': return sizeof(float) * (is_complex ? 2 : 1); + case 'd': return sizeof(double) * (is_complex ? 2 : 1); + case 'g': return sizeof(long double) * (is_complex ? 2 : 1); + case 'O': case 'P': return sizeof(void*); + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +typedef struct { char c; short x; } __Pyx_st_short; +typedef struct { char c; int x; } __Pyx_st_int; +typedef struct { char c; long x; } __Pyx_st_long; +typedef struct { char c; float x; } __Pyx_st_float; +typedef struct { char c; double x; } __Pyx_st_double; +typedef struct { char c; long double x; } __Pyx_st_longdouble; +typedef struct { char c; void *x; } __Pyx_st_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_st_float) - sizeof(float); + case 'd': return sizeof(__Pyx_st_double) - sizeof(double); + case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +/* These are for computing the padding at the end of the struct to align + on the first member of the struct. This will probably the same as above, + but we don't have any guarantees. + */ +typedef struct { short x; char c; } __Pyx_pad_short; +typedef struct { int x; char c; } __Pyx_pad_int; +typedef struct { long x; char c; } __Pyx_pad_long; +typedef struct { float x; char c; } __Pyx_pad_float; +typedef struct { double x; char c; } __Pyx_pad_double; +typedef struct { long double x; char c; } __Pyx_pad_longdouble; +typedef struct { void *x; char c; } __Pyx_pad_void_p; +#ifdef HAVE_LONG_LONG +typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; +#endif +static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { + switch (ch) { + case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; + case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); + case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); + case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); +#ifdef HAVE_LONG_LONG + case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); +#endif + case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); + case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); + case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); + case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); + default: + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } +} +static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { + switch (ch) { + case 'c': + return 'H'; + case 'b': case 'h': case 'i': + case 'l': case 'q': case 's': case 'p': + return 'I'; + case 'B': case 'H': case 'I': case 'L': case 'Q': + return 'U'; + case 'f': case 'd': case 'g': + return (is_complex ? 'C' : 'R'); + case 'O': + return 'O'; + case 'P': + return 'P'; + default: { + __Pyx_BufFmt_RaiseUnexpectedChar(ch); + return 0; + } + } +} +static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { + if (ctx->head == NULL || ctx->head->field == &ctx->root) { + const char* expected; + const char* quote; + if (ctx->head == NULL) { + expected = "end"; + quote = ""; + } else { + expected = ctx->head->field->type->name; + quote = "'"; + } + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected %s%s%s but got %s", + quote, expected, quote, + __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); + } else { + __Pyx_StructField* field = ctx->head->field; + __Pyx_StructField* parent = (ctx->head - 1)->field; + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", + field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), + parent->type->name, field->name); + } +} +static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { + char group; + size_t size, offset, arraysize = 1; + if (ctx->enc_type == 0) return 0; + if (ctx->head->field->type->arraysize[0]) { + int i, ndim = 0; + if (ctx->enc_type == 's' || ctx->enc_type == 'p') { + ctx->is_valid_array = ctx->head->field->type->ndim == 1; + ndim = 1; + if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { + PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %zu", + ctx->head->field->type->arraysize[0], ctx->enc_count); + return -1; + } + } + if (!ctx->is_valid_array) { + PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", + ctx->head->field->type->ndim, ndim); + return -1; + } + for (i = 0; i < ctx->head->field->type->ndim; i++) { + arraysize *= ctx->head->field->type->arraysize[i]; + } + ctx->is_valid_array = 0; + ctx->enc_count = 1; + } + group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); + do { + __Pyx_StructField* field = ctx->head->field; + __Pyx_TypeInfo* type = field->type; + if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { + size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); + } else { + size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); + } + if (ctx->enc_packmode == '@') { + size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); + size_t align_mod_offset; + if (align_at == 0) return -1; + align_mod_offset = ctx->fmt_offset % align_at; + if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; + if (ctx->struct_alignment == 0) + ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, + ctx->is_complex); + } + if (type->size != size || type->typegroup != group) { + if (type->typegroup == 'C' && type->fields != NULL) { + size_t parent_offset = ctx->head->parent_offset + field->offset; + ++ctx->head; + ctx->head->field = type->fields; + ctx->head->parent_offset = parent_offset; + continue; + } + if ((type->typegroup == 'H' || group == 'H') && type->size == size) { + } else { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + } + offset = ctx->head->parent_offset + field->offset; + if (ctx->fmt_offset != offset) { + PyErr_Format(PyExc_ValueError, + "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", + (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); + return -1; + } + ctx->fmt_offset += size; + if (arraysize) + ctx->fmt_offset += (arraysize - 1) * size; + --ctx->enc_count; + while (1) { + if (field == &ctx->root) { + ctx->head = NULL; + if (ctx->enc_count != 0) { + __Pyx_BufFmt_RaiseExpected(ctx); + return -1; + } + break; + } + ctx->head->field = ++field; + if (field->type == NULL) { + --ctx->head; + field = ctx->head->field; + continue; + } else if (field->type->typegroup == 'S') { + size_t parent_offset = ctx->head->parent_offset + field->offset; + if (field->type->fields->type == NULL) continue; + field = field->type->fields; + ++ctx->head; + ctx->head->field = field; + ctx->head->parent_offset = parent_offset; + break; + } else { + break; + } + } + } while (ctx->enc_count); + ctx->enc_type = 0; + ctx->is_complex = 0; + return 0; +} +static CYTHON_INLINE PyObject * +__pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) +{ + const char *ts = *tsp; + int i = 0, number; + int ndim = ctx->head->field->type->ndim; +; + ++ts; + if (ctx->new_count != 1) { + PyErr_SetString(PyExc_ValueError, + "Cannot handle repeated arrays in format string"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + while (*ts && *ts != ')') { + switch (*ts) { + case ' ': case '\f': case '\r': case '\n': case '\t': case '\v': continue; + default: break; + } + number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) + return PyErr_Format(PyExc_ValueError, + "Expected a dimension of size %zu, got %d", + ctx->head->field->type->arraysize[i], number); + if (*ts != ',' && *ts != ')') + return PyErr_Format(PyExc_ValueError, + "Expected a comma in format string, got '%c'", *ts); + if (*ts == ',') ts++; + i++; + } + if (i != ndim) + return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", + ctx->head->field->type->ndim, i); + if (!*ts) { + PyErr_SetString(PyExc_ValueError, + "Unexpected end of format string, expected ')'"); + return NULL; + } + ctx->is_valid_array = 1; + ctx->new_count = 1; + *tsp = ++ts; + return Py_None; +} +static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { + int got_Z = 0; + while (1) { + switch(*ts) { + case 0: + if (ctx->enc_type != 0 && ctx->head == NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + if (ctx->head != NULL) { + __Pyx_BufFmt_RaiseExpected(ctx); + return NULL; + } + return ts; + case ' ': + case '\r': + case '\n': + ++ts; + break; + case '<': + if (!__Pyx_IsLittleEndian()) { + PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '>': + case '!': + if (__Pyx_IsLittleEndian()) { + PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); + return NULL; + } + ctx->new_packmode = '='; + ++ts; + break; + case '=': + case '@': + case '^': + ctx->new_packmode = *ts++; + break; + case 'T': + { + const char* ts_after_sub; + size_t i, struct_count = ctx->new_count; + size_t struct_alignment = ctx->struct_alignment; + ctx->new_count = 1; + ++ts; + if (*ts != '{') { + PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); + return NULL; + } + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + ctx->enc_count = 0; + ctx->struct_alignment = 0; + ++ts; + ts_after_sub = ts; + for (i = 0; i != struct_count; ++i) { + ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); + if (!ts_after_sub) return NULL; + } + ts = ts_after_sub; + if (struct_alignment) ctx->struct_alignment = struct_alignment; + } + break; + case '}': + { + size_t alignment = ctx->struct_alignment; + ++ts; + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_type = 0; + if (alignment && ctx->fmt_offset % alignment) { + ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); + } + } + return ts; + case 'x': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->fmt_offset += ctx->new_count; + ctx->new_count = 1; + ctx->enc_count = 0; + ctx->enc_type = 0; + ctx->enc_packmode = ctx->new_packmode; + ++ts; + break; + case 'Z': + got_Z = 1; + ++ts; + if (*ts != 'f' && *ts != 'd' && *ts != 'g') { + __Pyx_BufFmt_RaiseUnexpectedChar('Z'); + return NULL; + } + case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': + case 'l': case 'L': case 'q': case 'Q': + case 'f': case 'd': case 'g': + case 'O': case 'p': + if (ctx->enc_type == *ts && got_Z == ctx->is_complex && + ctx->enc_packmode == ctx->new_packmode) { + ctx->enc_count += ctx->new_count; + ctx->new_count = 1; + got_Z = 0; + ++ts; + break; + } + case 's': + if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; + ctx->enc_count = ctx->new_count; + ctx->enc_packmode = ctx->new_packmode; + ctx->enc_type = *ts; + ctx->is_complex = got_Z; + ++ts; + ctx->new_count = 1; + got_Z = 0; + break; + case ':': + ++ts; + while(*ts != ':') ++ts; + ++ts; + break; + case '(': + if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; + break; + default: + { + int number = __Pyx_BufFmt_ExpectNumber(&ts); + if (number == -1) return NULL; + ctx->new_count = (size_t)number; + } + } + } +} +static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) { + buf->buf = NULL; + buf->obj = NULL; + buf->strides = __Pyx_zeros; + buf->shape = __Pyx_zeros; + buf->suboffsets = __Pyx_minusones; +} +static CYTHON_INLINE int __Pyx_GetBufferAndValidate( + Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, + int nd, int cast, __Pyx_BufFmt_StackElem* stack) +{ + if (obj == Py_None || obj == NULL) { + __Pyx_ZeroBuffer(buf); + return 0; + } + buf->buf = NULL; + if (__Pyx_GetBuffer(obj, buf, flags) == -1) goto fail; + if (buf->ndim != nd) { + PyErr_Format(PyExc_ValueError, + "Buffer has wrong number of dimensions (expected %d, got %d)", + nd, buf->ndim); + goto fail; + } + if (!cast) { + __Pyx_BufFmt_Context ctx; + __Pyx_BufFmt_Init(&ctx, stack, dtype); + if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; + } + if ((unsigned)buf->itemsize != dtype->size) { + PyErr_Format(PyExc_ValueError, + "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", + buf->itemsize, (buf->itemsize > 1) ? "s" : "", + dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); + goto fail; + } + if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; + return 0; +fail:; + __Pyx_ZeroBuffer(buf); + return -1; +} +static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { + if (info->buf == NULL) return; + if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; + __Pyx_ReleaseBuffer(info); +} + +static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { + PyObject *result; +#if CYTHON_COMPILING_IN_CPYTHON + result = PyDict_GetItem(__pyx_d, name); + if (likely(result)) { + Py_INCREF(result); + } else { +#else + result = PyObject_GetItem(__pyx_d, name); + if (!result) { + PyErr_Clear(); +#endif + result = __Pyx_GetBuiltinName(name); + } + return result; +} + +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = func->ob_type->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(PyObject_TypeCheck(obj, type))) + return 1; + PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", + Py_TYPE(obj)->tp_name, type->tp_name); + return 0; +} + +static void __Pyx_RaiseBufferIndexError(int axis) { + PyErr_Format(PyExc_IndexError, + "Out of bounds on buffer access (axis %d)", axis); +} + +static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyThreadState *tstate = PyThreadState_GET(); + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_Restore(type, value, tb); +#endif +} +static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { +#if CYTHON_COMPILING_IN_CPYTHON + PyThreadState *tstate = PyThreadState_GET(); + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(type, value, tb); +#endif +} + +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } +#if PY_VERSION_HEX >= 0x03030000 + if (cause) { +#else + if (cause && cause != Py_None) { +#endif + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = PyThreadState_GET(); + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if (strchr(__Pyx_MODULE_NAME, '.')) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(1); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + #endif + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_VERSION_HEX < 0x03030000 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_VERSION_HEX < 0x03030000 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +#include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + py_code = __pyx_find_code_object(c_line ? c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? c_line : py_line, py_code); + } + py_frame = PyFrame_New( + PyThreadState_GET(), /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + py_frame->f_lineno = py_line; + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +#if PY_MAJOR_VERSION < 3 +static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { + if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); + if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pw_5numpy_7ndarray_1__getbuffer__(obj, view, flags); + PyErr_Format(PyExc_TypeError, "'%.200s' does not have the buffer interface", Py_TYPE(obj)->tp_name); + return -1; +} +static void __Pyx_ReleaseBuffer(Py_buffer *view) { + PyObject *obj = view->obj; + if (!obj) return; + if (PyObject_CheckBuffer(obj)) { + PyBuffer_Release(view); + return; + } + if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) { __pyx_pw_5numpy_7ndarray_3__releasebuffer__(obj, view); return; } + Py_DECREF(obj); + view->obj = NULL; +} +#endif + + + static CYTHON_INLINE PyObject* __Pyx_PyInt_From_unsigned_int(unsigned int value) { + const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(unsigned int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(unsigned int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(unsigned int) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(unsigned int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(unsigned int), + little, !is_unsigned); + } +} + +#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" +#endif + +static CYTHON_INLINE unsigned int __Pyx_PyInt_As_unsigned_int(PyObject *x) { + const unsigned int neg_one = (unsigned int) -1, const_zero = (unsigned int) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(unsigned int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(unsigned int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (unsigned int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (unsigned int) 0; + case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, digits[0]) + case 2: + if (8 * sizeof(unsigned int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned int) >= 2 * PyLong_SHIFT) { + return (unsigned int) (((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(unsigned int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned int) >= 3 * PyLong_SHIFT) { + return (unsigned int) (((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(unsigned int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned int) >= 4 * PyLong_SHIFT) { + return (unsigned int) (((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (unsigned int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(unsigned int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(unsigned int, unsigned long, PyLong_AsUnsignedLong(x)) + } else if (sizeof(unsigned int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(unsigned int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (unsigned int) 0; + case -1: __PYX_VERIFY_RETURN_INT(unsigned int, sdigit, -(sdigit) digits[0]) + case 1: __PYX_VERIFY_RETURN_INT(unsigned int, digit, +digits[0]) + case -2: + if (8 * sizeof(unsigned int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { + return (unsigned int) (((unsigned int)-1)*(((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(unsigned int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { + return (unsigned int) ((((((unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(unsigned int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { + return (unsigned int) (((unsigned int)-1)*(((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(unsigned int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { + return (unsigned int) ((((((((unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(unsigned int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned int) - 1 > 4 * PyLong_SHIFT) { + return (unsigned int) (((unsigned int)-1)*(((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(unsigned int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(unsigned int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(unsigned int) - 1 > 4 * PyLong_SHIFT) { + return (unsigned int) ((((((((((unsigned int)digits[3]) << PyLong_SHIFT) | (unsigned int)digits[2]) << PyLong_SHIFT) | (unsigned int)digits[1]) << PyLong_SHIFT) | (unsigned int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(unsigned int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(unsigned int, long, PyLong_AsLong(x)) + } else if (sizeof(unsigned int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(unsigned int, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + unsigned int val; + PyObject *v = __Pyx_PyNumber_Int(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (unsigned int) -1; + } + } else { + unsigned int val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (unsigned int) -1; + val = __Pyx_PyInt_As_unsigned_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to unsigned int"); + return (unsigned int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to unsigned int"); + return (unsigned int) -1; +} + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return ::std::complex< float >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + return x + y*(__pyx_t_float_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { + __pyx_t_float_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +#if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float denom = b.real * b.real + b.imag * b.imag; + z.real = (a.real * b.real + a.imag * b.imag) / denom; + z.imag = (a.imag * b.real - a.real * b.imag) / denom; + return z; + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) { + __pyx_t_float_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrtf(z.real*z.real + z.imag*z.imag); + #else + return hypotf(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex a, __pyx_t_float_complex b) { + __pyx_t_float_complex z; + float r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + float denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prodf(a, a); + return __Pyx_c_prodf(a, a); + case 3: + z = __Pyx_c_prodf(a, a); + return __Pyx_c_prodf(z, a); + case 4: + z = __Pyx_c_prodf(a, a); + return __Pyx_c_prodf(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } + r = a.real; + theta = 0; + } else { + r = __Pyx_c_absf(a); + theta = atan2f(a.imag, a.real); + } + lnr = logf(r); + z_r = expf(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cosf(z_theta); + z.imag = z_r * sinf(z_theta); + return z; + } + #endif +#endif + +#if CYTHON_CCOMPLEX + #ifdef __cplusplus + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return ::std::complex< double >(x, y); + } + #else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + return x + y*(__pyx_t_double_complex)_Complex_I; + } + #endif +#else + static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { + __pyx_t_double_complex z; + z.real = x; + z.imag = y; + return z; + } +#endif + +#if CYTHON_CCOMPLEX +#else + static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) { + return (a.real == b.real) && (a.imag == b.imag); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real + b.real; + z.imag = a.imag + b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real - b.real; + z.imag = a.imag - b.imag; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + z.real = a.real * b.real - a.imag * b.imag; + z.imag = a.real * b.imag + a.imag * b.real; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double denom = b.real * b.real + b.imag * b.imag; + z.real = (a.real * b.real + a.imag * b.imag) / denom; + z.imag = (a.imag * b.real - a.real * b.imag) / denom; + return z; + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = -a.real; + z.imag = -a.imag; + return z; + } + static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) { + return (a.real == 0) && (a.imag == 0); + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) { + __pyx_t_double_complex z; + z.real = a.real; + z.imag = -a.imag; + return z; + } + #if 1 + static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) { + #if !defined(HAVE_HYPOT) || defined(_MSC_VER) + return sqrt(z.real*z.real + z.imag*z.imag); + #else + return hypot(z.real, z.imag); + #endif + } + static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex a, __pyx_t_double_complex b) { + __pyx_t_double_complex z; + double r, lnr, theta, z_r, z_theta; + if (b.imag == 0 && b.real == (int)b.real) { + if (b.real < 0) { + double denom = a.real * a.real + a.imag * a.imag; + a.real = a.real / denom; + a.imag = -a.imag / denom; + b.real = -b.real; + } + switch ((int)b.real) { + case 0: + z.real = 1; + z.imag = 0; + return z; + case 1: + return a; + case 2: + z = __Pyx_c_prod(a, a); + return __Pyx_c_prod(a, a); + case 3: + z = __Pyx_c_prod(a, a); + return __Pyx_c_prod(z, a); + case 4: + z = __Pyx_c_prod(a, a); + return __Pyx_c_prod(z, z); + } + } + if (a.imag == 0) { + if (a.real == 0) { + return a; + } + r = a.real; + theta = 0; + } else { + r = __Pyx_c_abs(a); + theta = atan2(a.imag, a.real); + } + lnr = log(r); + z_r = exp(lnr * b.real - theta * b.imag); + z_theta = theta * b.real + lnr * b.imag; + z.real = z_r * cos(z_theta); + z.imag = z_r * sin(z_theta); + return z; + } + #endif +#endif + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { + const int neg_one = (int) -1, const_zero = (int) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) digits[0]) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_Int(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_enum__NPY_TYPES(enum NPY_TYPES value) { + const enum NPY_TYPES neg_one = (enum NPY_TYPES) -1, const_zero = (enum NPY_TYPES) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(enum NPY_TYPES) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(enum NPY_TYPES) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(enum NPY_TYPES) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(enum NPY_TYPES), + little, !is_unsigned); + } +} + +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { + const long neg_one = (long) -1, const_zero = (long) 0; + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, -(sdigit) digits[0]) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_Int(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_Int(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +static int __Pyx_check_binary_version(void) { + char ctversion[4], rtversion[4]; + PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); + if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", + ctversion, __Pyx_MODULE_NAME, rtversion); + return PyErr_WarnEx(NULL, message, 1); + } + return 0; +} + +#ifndef __PYX_HAVE_RT_ImportModule +#define __PYX_HAVE_RT_ImportModule +static PyObject *__Pyx_ImportModule(const char *name) { + PyObject *py_name = 0; + PyObject *py_module = 0; + py_name = __Pyx_PyIdentifier_FromString(name); + if (!py_name) + goto bad; + py_module = PyImport_Import(py_name); + Py_DECREF(py_name); + return py_module; +bad: + Py_XDECREF(py_name); + return 0; +} +#endif + +#ifndef __PYX_HAVE_RT_ImportType +#define __PYX_HAVE_RT_ImportType +static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, + size_t size, int strict) +{ + PyObject *py_module = 0; + PyObject *result = 0; + PyObject *py_name = 0; + char warning[200]; + Py_ssize_t basicsize; +#ifdef Py_LIMITED_API + PyObject *py_basicsize; +#endif + py_module = __Pyx_ImportModule(module_name); + if (!py_module) + goto bad; + py_name = __Pyx_PyIdentifier_FromString(class_name); + if (!py_name) + goto bad; + result = PyObject_GetAttr(py_module, py_name); + Py_DECREF(py_name); + py_name = 0; + Py_DECREF(py_module); + py_module = 0; + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#ifndef Py_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if (!strict && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility", + module_name, class_name); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + else if ((size_t)basicsize != size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s has the wrong size, try recompiling", + module_name, class_name); + goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(py_module); + Py_XDECREF(result); + return NULL; +} +#endif + +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { +#if PY_VERSION_HEX < 0x03030000 + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +#else + if (__Pyx_PyUnicode_READY(o) == -1) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (PyUnicode_IS_ASCII(o)) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +#endif + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { + PyNumberMethods *m; + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (PyInt_Check(x) || PyLong_Check(x)) +#else + if (PyLong_Check(x)) +#endif + return __Pyx_NewRef(x); + m = Py_TYPE(x)->tp_as_number; +#if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = PyNumber_Long(x); + } +#else + if (m && m->nb_int) { + name = "int"; + res = PyNumber_Long(x); + } +#endif + if (res) { +#if PY_MAJOR_VERSION < 3 + if (!PyInt_Check(res) && !PyLong_Check(res)) { +#else + if (!PyLong_Check(res)) { +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + name, name, Py_TYPE(res)->tp_name); + Py_DECREF(res); + return NULL; + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(x); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/bbox.pyx b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/bbox.pyx new file mode 100644 index 000000000..936afdd4c --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/bbox.pyx @@ -0,0 +1,144 @@ +# -------------------------------------------------------- +# Fast R-CNN +# Copyright (c) 2015 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Written by Sergey Karayev +# -------------------------------------------------------- + +cimport cython +import numpy as np +cimport numpy as np + +DTYPE = np.float +ctypedef np.float_t DTYPE_t + +def bbox_overlaps_float( + np.ndarray[DTYPE_t, ndim=2] boxes, + np.ndarray[DTYPE_t, ndim=2] query_boxes): + """ + Parameters + ---------- + boxes: (N, 4) ndarray of float + query_boxes: (K, 4) ndarray of float + Returns + ------- + overlaps: (N, K) ndarray of overlap between boxes and query_boxes + """ + cdef unsigned int N = boxes.shape[0] + cdef unsigned int K = query_boxes.shape[0] + cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) + cdef DTYPE_t iw, ih, box_area + cdef DTYPE_t ua + cdef unsigned int k, n + for k in range(K): + box_area = ( + (query_boxes[k, 2] - query_boxes[k, 0]) * + (query_boxes[k, 3] - query_boxes[k, 1]) + ) + for n in range(N): + iw = ( + min(boxes[n, 2], query_boxes[k, 2]) - + max(boxes[n, 0], query_boxes[k, 0]) + ) + if iw > 0: + ih = ( + min(boxes[n, 3], query_boxes[k, 3]) - + max(boxes[n, 1], query_boxes[k, 1]) + ) + if ih > 0: + ua = float( + (boxes[n, 2] - boxes[n, 0]) * + (boxes[n, 3] - boxes[n, 1]) + + box_area - iw * ih + ) + # if query_boxes[k, 4] == -1: + # ua = float((boxes[n, 2] - boxes[n, 0]) + # *(boxes[n, 3] - boxes[n, 1])) + # else: + # ua = float( + # (boxes[n, 2] - boxes[n, 0]) * + # (boxes[n, 3] - boxes[n, 1]) + + # box_area - iw * ih + # ) + overlaps[n, k] = iw * ih / ua + return overlaps + +def bbox_overlaps( + np.ndarray[DTYPE_t, ndim=2] boxes, + np.ndarray[DTYPE_t, ndim=2] query_boxes): + """ + Parameters + ---------- + boxes: (N, 4) ndarray of float + query_boxes: (K, 4) ndarray of float + Returns + ------- + overlaps: (N, K) ndarray of overlap between boxes and query_boxes + """ + cdef unsigned int N = boxes.shape[0] + cdef unsigned int K = query_boxes.shape[0] + cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) + cdef DTYPE_t iw, ih, box_area + cdef DTYPE_t ua + cdef unsigned int k, n + for k in range(K): + box_area = ( + (query_boxes[k, 2] - query_boxes[k, 0] + 1) * + (query_boxes[k, 3] - query_boxes[k, 1] + 1) + ) + for n in range(N): + iw = ( + min(boxes[n, 2], query_boxes[k, 2]) - + max(boxes[n, 0], query_boxes[k, 0]) + 1 + ) + if iw > 0: + ih = ( + min(boxes[n, 3], query_boxes[k, 3]) - + max(boxes[n, 1], query_boxes[k, 1]) + 1 + ) + if ih > 0: + ua = float( + (boxes[n, 2] - boxes[n, 0] + 1) * + (boxes[n, 3] - boxes[n, 1] + 1) + + box_area - iw * ih + ) + overlaps[n, k] = iw * ih / ua + return overlaps + +def bbox_overlaps_self( + np.ndarray[DTYPE_t, ndim=2] boxes, + np.ndarray[DTYPE_t, ndim=2] query_boxes): + """ + Parameters + ---------- + boxes: (N, 4) ndarray of float + query_boxes: (K, 4) ndarray of float + Returns + ------- + overlaps: (N, K) ndarray of overlap between boxes and query_boxes + """ + cdef unsigned int N = boxes.shape[0] + cdef unsigned int K = query_boxes.shape[0] + cdef np.ndarray[DTYPE_t, ndim=2] overlaps = np.zeros((N, K), dtype=DTYPE) + cdef DTYPE_t iw, ih, box_area + cdef DTYPE_t ua + cdef unsigned int k, n + for k in range(K): + box_area = ( + (query_boxes[k, 2] - query_boxes[k, 0] + 1) * + (query_boxes[k, 3] - query_boxes[k, 1] + 1) + ) + for n in range(N): + iw = ( + min(boxes[n, 2], query_boxes[k, 2]) - + max(boxes[n, 0], query_boxes[k, 0]) + 1 + ) + if iw > 0: + ih = ( + min(boxes[n, 3], query_boxes[k, 3]) - + max(boxes[n, 1], query_boxes[k, 1]) + 1 + ) + if ih > 0: + ua = float(box_area) + overlaps[n, k] = iw * ih / ua + return overlaps \ No newline at end of file diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/blob.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/blob.py new file mode 100644 index 000000000..843948934 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/blob.py @@ -0,0 +1,49 @@ +# -------------------------------------------------------- +# Fast R-CNN +# Copyright (c) 2015 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Written by Ross Girshick +# -------------------------------------------------------- + +"""Blob helper functions.""" +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from npu_bridge.npu_init import * + +import numpy as np +import cv2 + + +def im_list_to_blob(ims): + """Convert a list of images into a network input. + + Assumes images are already prepared (means subtracted, BGR order, ...). + """ + max_shape = np.array([im.shape for im in ims]).max(axis=0) + num_images = len(ims) + blob = np.zeros((num_images, max_shape[0], max_shape[1], 3), + dtype=np.float32) + for i in range(num_images): + im = ims[i] + blob[i, 0:im.shape[0], 0:im.shape[1], :] = im + + return blob + + +def prep_im_for_blob(im, pixel_means, target_size, max_size): + """Mean subtract and scale an image for use in a blob.""" + im = im.astype(np.float32, copy=False) + im -= pixel_means + im_shape = im.shape + im_size_min = np.min(im_shape[0:2]) + im_size_max = np.max(im_shape[0:2]) + im_scale = float(target_size) / float(im_size_min) + # Prevent the biggest axis from being more than MAX_SIZE + if np.round(im_scale * im_size_max) > max_size: + im_scale = float(max_size) / float(im_size_max) + im = cv2.resize(im, None, None, fx=im_scale, fy=im_scale, + interpolation=cv2.INTER_LINEAR) + + return im, im_scale + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/boxes_grid.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/boxes_grid.py new file mode 100644 index 000000000..3a9628898 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/boxes_grid.py @@ -0,0 +1,75 @@ +# -------------------------------------------------------- +# Subcategory CNN +# Copyright (c) 2015 CVGL Stanford +# Licensed under The MIT License [see LICENSE for details] +# Written by Yu Xiang +# -------------------------------------------------------- +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from npu_bridge.npu_init import * + +import numpy as np +import math +from config import cfg + + +def get_boxes_grid(image_height, image_width): + """ + Return the boxes on image grid. + """ + + # height and width of the heatmap + if cfg.NET_NAME == 'CaffeNet': + height = np.floor((image_height * max(cfg.TRAIN.SCALES) - 1) / 4.0 + 1) + height = np.floor((height - 1) / 2.0 + 1 + 0.5) + height = np.floor((height - 1) / 2.0 + 1 + 0.5) + + width = np.floor((image_width * max(cfg.TRAIN.SCALES) - 1) / 4.0 + 1) + width = np.floor((width - 1) / 2.0 + 1 + 0.5) + width = np.floor((width - 1) / 2.0 + 1 + 0.5) + elif cfg.NET_NAME == 'VGGnet': + height = np.floor(image_height * max(cfg.TRAIN.SCALES) / 2.0 + 0.5) + height = np.floor(height / 2.0 + 0.5) + height = np.floor(height / 2.0 + 0.5) + height = np.floor(height / 2.0 + 0.5) + + width = np.floor(image_width * max(cfg.TRAIN.SCALES) / 2.0 + 0.5) + width = np.floor(width / 2.0 + 0.5) + width = np.floor(width / 2.0 + 0.5) + width = np.floor(width / 2.0 + 0.5) + else: + assert (1), 'The network architecture is not supported in utils.get_boxes_grid!' + + # compute the grid box centers + h = np.arange(height) + w = np.arange(width) + y, x = np.meshgrid(h, w, indexing='ij') + centers = np.dstack((x, y)) + centers = np.reshape(centers, (-1, 2)) + num = centers.shape[0] + + # compute width and height of grid box + area = cfg.TRAIN.KERNEL_SIZE * cfg.TRAIN.KERNEL_SIZE + aspect = cfg.TRAIN.ASPECTS # height / width + num_aspect = len(aspect) + widths = np.zeros((1, num_aspect), dtype=np.float32) + heights = np.zeros((1, num_aspect), dtype=np.float32) + for i in range(num_aspect): + widths[0, i] = math.sqrt(area / aspect[i]) + heights[0, i] = widths[0, i] * aspect[i] + + # construct grid boxes + centers = np.repeat(centers, num_aspect, axis=0) + widths = np.tile(widths, num).transpose() + heights = np.tile(heights, num).transpose() + + x1 = np.reshape(centers[:, 0], (-1, 1)) - widths * 0.5 + x2 = np.reshape(centers[:, 0], (-1, 1)) + widths * 0.5 + y1 = np.reshape(centers[:, 1], (-1, 1)) - heights * 0.5 + y2 = np.reshape(centers[:, 1], (-1, 1)) + heights * 0.5 + + boxes_grid = np.hstack((x1, y1, x2, y2)) / cfg.TRAIN.SPATIAL_SCALE + + return boxes_grid, centers[:, 0], centers[:, 1] + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/mask.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/mask.py new file mode 100644 index 000000000..132e2f3d1 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/mask.py @@ -0,0 +1,42 @@ +from npu_bridge.npu_init import * +import json +import numpy as np +import cv2 +from pycocotools import mask as COCOmask + +def showMask(img_obj): + img = cv2.imread(img_obj['fpath']) + img_ori = img.copy() + gtmasks = img_obj['gtmasks'] + n = len(gtmasks) + print(img.shape) + for i, mobj in enumerate(gtmasks): + if not (type(mobj['mask']) is list): + print("Pass a RLE mask") + continue + else: + pts = np.round(np.asarray(mobj['mask'][0])) + pts = pts.reshape(pts.shape[0] // 2, 2) + pts = np.int32(pts) + color = np.uint8(np.random.rand(3) * 255).tolist() + cv2.fillPoly(img, [pts], color) + cv2.addWeighted(img, 0.5, img_ori, 0.5, 0, img) + cv2.imshow("Mask", img) + cv2.waitKey(0) + +def get_seg(height, width, seg_ann): + label = np.zeros((height, width, 1)) + if type(seg_ann) == list or type(seg_ann) == np.ndarray: + for s in seg_ann: + poly = np.array(s, np.int).reshape(len(s)//2, 2) + cv2.fillPoly(label, [poly], 1) + else: + if type(seg_ann['counts']) == list: + rle = COCOmask.frPyObjects([seg_ann], label.shape[0], label.shape[1]) + else: + rle = [seg_ann] + # we set the ground truth as one-hot + m = COCOmask.decode(rle) * 1 + label[label == 0] = m[label == 0] + return label[:, :, 0] + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/timer.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/timer.py new file mode 100644 index 000000000..6e8c27780 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/lib/utils/timer.py @@ -0,0 +1,40 @@ +# -------------------------------------------------------- +# Fast R-CNN +# Copyright (c) 2015 Microsoft +# Licensed under The MIT License [see LICENSE for details] +# Written by Ross Girshick +# -------------------------------------------------------- + +from npu_bridge.npu_init import * +import time + +class Timer(object): + """A simple timer.""" + def __init__(self): + self.total_time = 0. + self.calls = 0 + self.start_time = 0. + self.diff = 0. + self.average_time = 0. + self.warm_up = 0 + + def tic(self): + # using time.time instead of time.clock because time time.clock + # does not normalize for multithreading + self.start_time = time.time() + + def toc(self, average=True): + self.diff = time.time() - self.start_time + if self.warm_up < 100: + self.warm_up += 1 + return self.diff + else: + self.total_time += self.diff + self.calls += 1 + self.average_time = self.total_time / self.calls + + if average: + return self.average_time + else: + return self.diff + -- Gitee From d4ccf5ee5718c32bb8d0cc9dfd6d8bb08bcc0350 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:51:41 +0000 Subject: [PATCH 25/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20main?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From a3c2985aebb6640f6cb642d2905125fe0fb0fff9 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 13:56:56 +0000 Subject: [PATCH 26/59] first commit --- .../src/main/config.py | 140 +++++++++++++++++ .../src/main/gen_batch.py | 142 ++++++++++++++++++ .../src/main/model.py | 88 +++++++++++ 3 files changed, 370 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/config.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/gen_batch.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/model.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/config.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/config.py new file mode 100644 index 000000000..42cc9f2fa --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/config.py @@ -0,0 +1,140 @@ +from npu_bridge.npu_init import * +import os +import os.path as osp +import sys +import numpy as np + + +class Config: + ## dataset + dataset = 'COCO' # 'COCO', 'PoseTrack', 'MPII' + testset = 'val' # train, test, val (there is no validation set for MPII) + + ## directory + cur_dir = osp.dirname(os.path.abspath(__file__)) + root_dir = osp.join(cur_dir, '..') + data_dir = osp.join(root_dir, 'data') + # output_dir = osp.join(root_dir, 'output') # 修改成cache/result + + output_dir = "cache/result" + print("========>>>>>output_dir:{}".format(output_dir)) + + # 修改模型路径 + data_path = "cache/dataset" + model_dump_dir_test = osp.join(data_path, 'model_dump', dataset) # test时用的 + model_dump_dir = osp.join(output_dir, 'model_dump', dataset) # train时用的 + vis_dir = osp.join(output_dir, 'vis', dataset) + log_dir = osp.join(output_dir, 'log', dataset) + result_dir = osp.join(output_dir, 'result', dataset) + # 生成bin + bins_dir = osp.join(output_dir, 'bins', dataset) + # 生成pb + pb_dir = osp.join(output_dir, 'pb_model', dataset) + print("========>>>>>config_bins_dir:{}".format(bins_dir)) + print("========>>>>>config_pb_dir:{}".format(pb_dir)) + + ## model setting + backbone = 'resnet50' # 'resnet50', 'resnet101', 'resnet152' + # init_model = osp.join(data_dir, 'imagenet_weights', 'resnet_v1_' + backbone[6:] + '.ckpt') + init_model = osp.join(data_path, 'imagenet_weights', 'resnet_v1_' + backbone[6:] + '.ckpt') + print("========>>>>>ckpt:{}".format(init_model)) + + ## input, output + input_shape = (256, 192) # (256,192), (384,288) + output_shape = (input_shape[0] // 4, input_shape[1] // 4) + if output_shape[0] == 64: + sigma = 2 + elif output_shape[0] == 96: + sigma = 3 + pixel_means = np.array([[[123.68, 116.78, 103.94]]]) + + ## training config + lr_dec_epoch = [90, 120] + end_epoch = 140 # 修改 + lr = 5e-4 + lr_dec_factor = 10 + optimizer = 'adam' + weight_decay = 1e-5 + bn_train = True + batch_size = 32 + scale_factor = 0.3 + rotation_factor = 40 + + ## testing config + useGTbbox = False + flip_test = True + oks_nms_thr = 0.9 + score_thr = 0.2 + test_batch_size = 32 + + ## others + multi_thread_enable = True + num_thread = 10 + gpu_ids = '0' + num_gpus = 1 + continue_train = False + display = 1 + + ## helper functions + def get_lr(self, epoch): + for e in self.lr_dec_epoch: + if epoch < e: + break + if epoch < self.lr_dec_epoch[-1]: + i = self.lr_dec_epoch.index(e) + return self.lr / (self.lr_dec_factor ** i) + else: + return self.lr / (self.lr_dec_factor ** len(self.lr_dec_epoch)) + + def normalize_input(self, img): + return img - self.pixel_means + + def denormalize_input(self, img): + return img + self.pixel_means + + # def set_args(self, gpu_ids, continue_train=False): + # self.gpu_ids = gpu_ids + # self.num_gpus = len(self.gpu_ids.split(',')) + # self.continue_train = continue_train + # os.environ["CUDA_VISIBLE_DEVICES"] = self.gpu_ids + # print('>>> Using /gpu:{}'.format(self.gpu_ids)) + + def set_args(self, continue_train=False): + # self.data_url = data_url + # self.num_gpus = len(self.gpu_ids.split(',')) + + # os.environ['ASCEND_SLOG_PRINT_TO_STDOUT'] = '1' + # os.environ['ASCEND_GLOBAL_LOG_LEVEL'] = '1' + + # os.environ["CUDA_VISIBLE_DEVICES"] = self.gpu_ids + # self.gpu_ids = gpu_ids + # self.num_gpus = len(self.gpu_ids.split(',')) + # os.environ['DEVICE_ID'] = '1' + self.continue_train = continue_train + + +cfg = Config() + +sys.path.insert(0, osp.join(cfg.root_dir, 'lib')) + +from tfflat.utils import add_pypath, make_dir + +add_pypath(osp.join(cfg.data_dir)) +add_pypath(osp.join(cfg.data_dir, cfg.dataset)) +make_dir(cfg.model_dump_dir) +make_dir(cfg.model_dump_dir_test) +make_dir(cfg.vis_dir) +make_dir(cfg.log_dir) +make_dir(cfg.result_dir) +make_dir(cfg.bins_dir) +make_dir(cfg.pb_dir) + +from dataset import dbcfg + +cfg.num_kps = dbcfg.num_kps +cfg.kps_names = dbcfg.kps_names +cfg.kps_lines = dbcfg.kps_lines +cfg.kps_symmetry = dbcfg.kps_symmetry +cfg.img_path = dbcfg.img_path +cfg.human_det_path = dbcfg.human_det_path +cfg.vis_keypoints = dbcfg.vis_keypoints diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/gen_batch.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/gen_batch.py new file mode 100644 index 000000000..6f6e9acfe --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/gen_batch.py @@ -0,0 +1,142 @@ +from npu_bridge.npu_init import * +import os +import os.path as osp +import numpy as np +import cv2 +from config import cfg +import random +import time +import math +from PIL import Image, ImageDraw +import matplotlib.pyplot as plt + +# 仿射变换 +def get_affine_transform(center, + scale, + rot, + output_size, + shift=np.array([0, 0], dtype=np.float32), + inv=0): + if not isinstance(scale, np.ndarray) and not isinstance(scale, list): + print(scale) + scale = np.array([scale, scale]) + + src_w = scale[0] + dst_w = output_size[0] + dst_h = output_size[1] + + rot_rad = np.pi * rot / 180 + src_dir = get_dir([0, src_w * -0.5], rot_rad) + dst_dir = np.array([0, dst_w * -0.5], np.float32) + + src = np.zeros((3, 2), dtype=np.float32) + dst = np.zeros((3, 2), dtype=np.float32) + src[0, :] = center + scale * shift + src[1, :] = center + src_dir + scale * shift + dst[0, :] = [dst_w * 0.5, dst_h * 0.5] + dst[1, :] = np.array([dst_w * 0.5, dst_h * 0.5]) + dst_dir + + src[2:, :] = get_3rd_point(src[0, :], src[1, :]) + dst[2:, :] = get_3rd_point(dst[0, :], dst[1, :]) + + if inv: + trans = cv2.getAffineTransform(np.float32(dst), np.float32(src)) + else: + trans = cv2.getAffineTransform(np.float32(src), np.float32(dst)) + + return trans + +def affine_transform(pt, t): + new_pt = np.array([pt[0], pt[1], 1.]).T + new_pt = np.dot(t, new_pt) + return new_pt[:2] + +def get_dir(src_point, rot_rad): + sn, cs = np.sin(rot_rad), np.cos(rot_rad) + + src_result = [0, 0] + src_result[0] = src_point[0] * cs - src_point[1] * sn + src_result[1] = src_point[0] * sn + src_point[1] * cs + + return src_result + +def get_3rd_point(a, b): + direct = a - b + return b + np.array([-direct[1], direct[0]], dtype=np.float32) + +def generate_batch(d, stage='train'): + + img = cv2.imread(os.path.join(cfg.img_path, d['imgpath']), cv2.IMREAD_COLOR | cv2.IMREAD_IGNORE_ORIENTATION) + if img is None: + print('cannot read ' + os.path.join(cfg.img_path, d['imgpath'])) + assert 0 + + bbox = np.array(d['bbox']).astype(np.float32) + + x, y, w, h = bbox + aspect_ratio = cfg.input_shape[1]/cfg.input_shape[0] + center = np.array([x + w * 0.5, y + h * 0.5]) + if w > aspect_ratio * h: + h = w / aspect_ratio + elif w < aspect_ratio * h: + w = h * aspect_ratio + scale = np.array([w,h]) * 1.25 + rotation = 0 + + if stage == 'train': + + joints = np.array(d['joints']).reshape(cfg.num_kps, 3).astype(np.float32) + + # data augmentation + scale = scale * np.clip(np.random.randn()*cfg.scale_factor + 1, 1-cfg.scale_factor, 1+cfg.scale_factor) + rotation = np.clip(np.random.randn()*cfg.rotation_factor, -cfg.rotation_factor*2, cfg.rotation_factor*2)\ + if random.random() <= 0.6 else 0 + if random.random() <= 0.5: + img = img[:, ::-1, :] + center[0] = img.shape[1] - 1 - center[0] + joints[:,0] = img.shape[1] - 1 - joints[:,0] + for (q, w) in cfg.kps_symmetry: + joints_q, joints_w = joints[q,:].copy(), joints[w,:].copy() + joints[w,:], joints[q,:] = joints_q, joints_w + + trans = get_affine_transform(center, scale, rotation, (cfg.input_shape[1], cfg.input_shape[0])) + cropped_img = cv2.warpAffine(img, trans, (cfg.input_shape[1], cfg.input_shape[0]), flags=cv2.INTER_LINEAR) + #cropped_img = cropped_img[:,:, ::-1] + cropped_img = cfg.normalize_input(cropped_img) + + for i in range(cfg.num_kps): + if joints[i,2] > 0: + joints[i,:2] = affine_transform(joints[i,:2], trans) + joints[i,2] *= ((joints[i,0] >= 0) & (joints[i,0] < cfg.input_shape[1]) & (joints[i,1] >= 0) & (joints[i,1] < cfg.input_shape[0])) + target_coord = joints[:,:2] + target_valid = joints[:,2] + + # for debug + vis = False + if vis: + filename = str(random.randrange(1,500)) + tmpimg = cropped_img.astype(np.float32).copy() + tmpimg = cfg.denormalize_input(tmpimg) + tmpimg = tmpimg.astype(np.uint8).copy() + tmpkps = np.zeros((3,cfg.num_kps)) + tmpkps[:2,:] = target_coord.transpose(1,0) + tmpkps[2,:] = target_valid + tmpimg = cfg.vis_keypoints(tmpimg, tmpkps) + cv2.imwrite(osp.join(cfg.vis_dir, filename + '_gt.jpg'), tmpimg) + + return [cropped_img, + target_coord, + (target_valid > 0)] + + else: + trans = get_affine_transform(center, scale, rotation, (cfg.input_shape[1], cfg.input_shape[0])) + cropped_img = cv2.warpAffine(img, trans, (cfg.input_shape[1], cfg.input_shape[0]), flags=cv2.INTER_LINEAR) # trans是变换矩阵 + #cropped_img = cropped_img[:,:, ::-1] + cropped_img = cfg.normalize_input(cropped_img) + + crop_info = np.asarray([center[0]-scale[0]*0.5, center[1]-scale[1]*0.5, center[0]+scale[0]*0.5, center[1]+scale[1]*0.5]) + + return [cropped_img, crop_info] + + + diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/model.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/model.py new file mode 100644 index 000000000..1f5371898 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/model.py @@ -0,0 +1,88 @@ +from npu_bridge.npu_init import * +import tensorflow as tf +import tensorflow.contrib.slim as slim +import numpy as np +import json +import math +from functools import partial + +from config import cfg +from tfflat.base import ModelDesc + + +from nets.basemodel import resnet50, resnet101, resnet152, resnet_arg_scope, resnet_v1 +resnet_arg_scope = partial(resnet_arg_scope, bn_trainable=cfg.bn_train) +# tf.reset_default_graph() + + +class Model(ModelDesc): + + def head_net(self, blocks, is_training, trainable=True): + + normal_initializer = tf.truncated_normal_initializer(0, 0.01) + msra_initializer = tf.contrib.layers.variance_scaling_initializer() + xavier_initializer = tf.contrib.layers.xavier_initializer() + + with slim.arg_scope(resnet_arg_scope(bn_is_training=is_training)): + + out = slim.conv2d_transpose(blocks[-1], 256, [4, 4], stride=2, + trainable=trainable, weights_initializer=normal_initializer, + padding='SAME', activation_fn=tf.nn.relu, + scope='up1') + out = slim.conv2d_transpose(out, 256, [4, 4], stride=2, + trainable=trainable, weights_initializer=normal_initializer, + padding='SAME', activation_fn=tf.nn.relu, + scope='up2') + out = slim.conv2d_transpose(out, 256, [4, 4], stride=2, + trainable=trainable, weights_initializer=normal_initializer, + padding='SAME', activation_fn=tf.nn.relu, + scope='up3') + + out = slim.conv2d(out, cfg.num_kps, [1, 1], + trainable=trainable, weights_initializer=msra_initializer, + padding='SAME', normalizer_fn=None, activation_fn=None, + scope='out') + + return out + + def render_gaussian_heatmap(self, coord, output_shape, sigma): + + x = [i for i in range(output_shape[1])] + y = [i for i in range(output_shape[0])] + xx,yy = tf.meshgrid(x,y) + xx = tf.reshape(tf.to_float(xx), (1,*output_shape,1)) + yy = tf.reshape(tf.to_float(yy), (1,*output_shape,1)) + + x = tf.floor(tf.reshape(coord[:,:,0],[-1,1,1,cfg.num_kps]) / cfg.input_shape[1] * output_shape[1] + 0.5) + y = tf.floor(tf.reshape(coord[:,:,1],[-1,1,1,cfg.num_kps]) / cfg.input_shape[0] * output_shape[0] + 0.5) + + heatmap = tf.exp(-(((xx-x)/tf.to_float(sigma))**2)/tf.to_float(2) -(((yy-y)/tf.to_float(sigma))**2)/tf.to_float(2)) + + return heatmap * 255. + + def make_network(self, is_train): + global target_coord, valid + if is_train: + image = tf.placeholder(tf.float32, shape=[cfg.batch_size, *cfg.input_shape, 3]) + target_coord = tf.placeholder(tf.float32, shape=[cfg.batch_size, cfg.num_kps, 2]) + valid = tf.placeholder(tf.float32, shape=[cfg.batch_size, cfg.num_kps]) + self.set_inputs(image, target_coord, valid) + else: + image = tf.placeholder(tf.float32, shape=[None, *cfg.input_shape, 3]) + # image = tf.placeholder(tf.float32, shape=[cfg.test_batch_size, *cfg.input_shape, 3]) + self.set_inputs(image) + + backbone = eval(cfg.backbone) + resnet_fms = backbone(image, is_train, bn_trainable=True) + heatmap_outs = self.head_net(resnet_fms, is_train) + + if is_train: + gt_heatmap = tf.stop_gradient(self.render_gaussian_heatmap(target_coord, cfg.output_shape, cfg.sigma)) + valid_mask = tf.reshape(valid, [cfg.batch_size, 1, 1, cfg.num_kps]) + loss = tf.reduce_mean(tf.square(heatmap_outs - gt_heatmap) * valid_mask) + self.add_tower_summary('loss', loss) + self.set_loss(loss) + else: + self.set_outputs(heatmap_outs) + + -- Gitee From 7e4c43e2d7114de82afd0da18b5cc22461982b55 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 14:08:37 +0000 Subject: [PATCH 27/59] first commit --- .../src/boot_inference.py | 62 +++++++++++++++++++ .../src/boot_pb_frozen.py | 60 ++++++++++++++++++ .../src/boot_test.py | 62 +++++++++++++++++++ 3 files changed, 184 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_inference.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_pb_frozen.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_test.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_inference.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_inference.py new file mode 100644 index 000000000..474e11fc7 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_inference.py @@ -0,0 +1,62 @@ +# coding=utf-8 +import os +import argparse +import datetime +import moxing as mox + +import tensorflow as tf +import os +import sys + +# Code dir: /home/work/user-job-dir/code # 在ModelArts上的代码存储目录(父目录均会被重命名为code)。 +# Work dir: /home/work/workspace/device2 # device id因job而异 + +# print(os.system('env')) + +if __name__ == '__main__': + + code_dir = os.path.dirname(os.path.realpath(__file__)) + work_dir = os.getcwd() + print("===>>>code_dir:{}".format(code_dir)) + print("===>>>work_dir{}".format(work_dir)) + + parser = argparse.ArgumentParser() + + # 解析输入参数data_url + parser.add_argument("--data_url", type=str, default="./dataset") # 这里要写绝对路径吗 + parser.add_argument("--train_url", type=str, default="./output") + parser.add_argument('--test_epoch', type=str, default='140') + args = parser.parse_args() + + # 打印config参数 + print("--------config----------") + for k in list(vars(args).keys()): + print("key:{}: value:{}".format(k, vars(args)[k])) + print("--------config----------") + + # 在modelarts创建数据存放目录 + data_dir = "cache/dataset" + # os.makedirs(data_dir) + + # OBS数据拷贝到modelarts容器内 + print("===>>>Copy files from obs:{} to modelarts dir:{}".format(args.data_url, data_dir)) + mox.file.copy_parallel(args.data_url, data_dir) + files = os.listdir(data_dir) + print("===>>>Files:", files) + + print("===>>>Begin booting:") + os.system("python /home/ma-user/modelarts/user-job-dir/code/main/pb_inference.py") + print("===>>>Test finished:") + + # 训练完成, 结果上传到OBS + output_dir = "cache/result" + remote_dir = os.path.join(args.train_url) + if not mox.file.exists(remote_dir): + mox.file.make_dirs(remote_dir) + # start = datetime.datetime.now() + print("===>>>Copy files from local dir:{} to obs:{}".format(output_dir, remote_dir)) + mox.file.copy_parallel(src_url=output_dir, dst_url=remote_dir) + # end = datetime.datetime.now() + # print("===>>>Copy from local to obs, time use:{}(s)".format((end - start).seconds)) + files = os.listdir(output_dir) + print("===>>>Files number:", len(files)) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_pb_frozen.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_pb_frozen.py new file mode 100644 index 000000000..7084f6528 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_pb_frozen.py @@ -0,0 +1,60 @@ +import os +import argparse +import datetime +import moxing as mox + +import tensorflow as tf +import os +import sys + +if __name__ == '__main__': + code_dir = os.path.dirname(os.path.realpath(__file__)) + work_dir = os.getcwd() + print("===>>>code_dir:{}".format(code_dir)) + print("===>>>work_dir{}".format(work_dir)) + + parser = argparse.ArgumentParser() + + # 解析输入参数data_url + parser.add_argument("--data_url", type=str, default="./dataset") + parser.add_argument("--train_url", type=str, default="./output") + + # parser.add_argument('--gpu', type=str, dest='gpu_ids') + parser.add_argument('--continue', dest='continue_train', action='store_true') + args = parser.parse_args() + + # 打印config参数 + print("--------config----------") + for k in list(vars(args).keys()): + print("key:{}: value:{}".format(k, vars(args)[k])) + print("--------config----------") + + # 在modelarts创建数据存放目录 + data_dir = "cache/dataset" + # os.makedirs(data_dir) + + # OBS数据拷贝到modelarts容器内 + print("===>>>Copy files from obs:{} to modelarts dir:{}".format(args.data_url, data_dir)) + mox.file.copy_parallel(args.data_url, data_dir) + for rt, dirs, fl in os.walk(data_dir, topdown=True): + for nm in fl: + filepath = os.path.join(rt, nm) + print("filepath:", filepath) + + print("===>>>Begin booting:") + os.system("python /home/ma-user/modelarts/user-job-dir/code/main/pb_frozen.py") + + # print("===>>>Training finished:") + + # pb完成 + output_dir = "cache/result" + remote_dir = os.path.join(args.train_url) + if not mox.file.exists(remote_dir): + mox.file.make_dirs(remote_dir) + # start = datetime.datetime.now() + print("===>>>Copy files from local dir:{} to obs:{}".format(output_dir, remote_dir)) + mox.file.copy_parallel(src_url=output_dir, dst_url=remote_dir) + # end = datetime.datetime.now() + # print("===>>>Copy from local to obs, time use:{}(s)".format((end - start).seconds)) + files = os.listdir(output_dir) + print("===>>>Files number:", len(files)) \ No newline at end of file diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_test.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_test.py new file mode 100644 index 000000000..041f8c2cd --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/boot_test.py @@ -0,0 +1,62 @@ +# coding=utf-8 +import os +import argparse +import datetime +import moxing as mox + +import tensorflow as tf +import os +import sys + +# Code dir: /home/work/user-job-dir/code # 在ModelArts上的代码存储目录(父目录均会被重命名为code)。 +# Work dir: /home/work/workspace/device2 # device id因job而异 + +# print(os.system('env')) + +if __name__ == '__main__': + + code_dir = os.path.dirname(os.path.realpath(__file__)) + work_dir = os.getcwd() + print("===>>>code_dir:{}".format(code_dir)) + print("===>>>work_dir{}".format(work_dir)) + + parser = argparse.ArgumentParser() + + # 解析输入参数data_url + parser.add_argument("--data_url", type=str, default="./dataset") # 这里要写绝对路径吗 + parser.add_argument("--train_url", type=str, default="./output") + parser.add_argument('--test_epoch', type=str, default='140') + args = parser.parse_args() + + # 打印config参数 + print("--------config----------") + for k in list(vars(args).keys()): + print("key:{}: value:{}".format(k, vars(args)[k])) + print("--------config----------") + + # 在modelarts创建数据存放目录 + data_dir = "cache/dataset" + # os.makedirs(data_dir) + + # OBS数据拷贝到modelarts容器内 + print("===>>>Copy files from obs:{} to modelarts dir:{}".format(args.data_url, data_dir)) + mox.file.copy_parallel(args.data_url, data_dir) + files = os.listdir(data_dir) + print("===>>>Files:", files) + + print("===>>>Begin booting:") + os.system("python /home/ma-user/modelarts/user-job-dir/code/main/test.py") + print("===>>>Test finished:") + + # 训练完成, 结果上传到OBS + output_dir = "cache/result" + remote_dir = os.path.join(args.train_url) + if not mox.file.exists(remote_dir): + mox.file.make_dirs(remote_dir) + # start = datetime.datetime.now() + print("===>>>Copy files from local dir:{} to obs:{}".format(output_dir, remote_dir)) + mox.file.copy_parallel(src_url=output_dir, dst_url=remote_dir) + # end = datetime.datetime.now() + # print("===>>>Copy from local to obs, time use:{}(s)".format((end - start).seconds)) + files = os.listdir(output_dir) + print("===>>>Files number:", len(files)) -- Gitee From 117f36de3e50f086b82cc9ec759a638b8e150f14 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 14:17:45 +0000 Subject: [PATCH 28/59] first commit --- .../src/main/pb_frozen.py | 29 ++ .../src/main/pb_inference.py | 237 ++++++++++++++++ .../src/main/test.py | 267 ++++++++++++++++++ 3 files changed, 533 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/pb_frozen.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/pb_inference.py create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/test.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/pb_frozen.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/pb_frozen.py new file mode 100644 index 000000000..b43bb7261 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/pb_frozen.py @@ -0,0 +1,29 @@ +import os +import tensorflow as tf +from model import Model +from config import cfg +from tensorflow.python.tools import freeze_graph + + +ckpt_path = "cache/dataset/COCO/snapshot_140.ckpt" +result_dir = cfg.pb_dir + +tf.reset_default_graph() +model = Model() +model.make_network(is_train=False) + +with tf.Session() as sess: + tf.train.write_graph(sess.graph_def, result_dir, 'model.pb') + + freeze_graph.freeze_graph( + input_graph=os.path.join(result_dir, 'model.pb'), + input_saver='', + input_binary=False, + input_checkpoint=ckpt_path, + output_node_names='out/BiasAdd', + restore_op_name='save/restore_all', + filename_tensor_name='save/Const:0', + output_graph=os.path.join(result_dir, 'frozen_model.pb'), + clear_devices=False, + initializer_nodes='' + ) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/pb_inference.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/pb_inference.py new file mode 100644 index 000000000..386950eb1 --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/pb_inference.py @@ -0,0 +1,237 @@ +from npu_bridge.npu_init import * +import os +import os.path as osp +import numpy as np +import argparse +from config import cfg +import cv2 +import sys +import time +import json +from PIL import Image +import matplotlib.pyplot as plt +import pickle +from tqdm import tqdm +import math + +import tensorflow as tf + +from tfflat.base import Tester +from tfflat.utils import mem_info +from model import Model + +from gen_batch import generate_batch +from dataset import Dataset +from nms.nms_my import oks_nms + +output_dir = "cache/result" + +msame_out_path = 'cache/dataset/outs' + + +def test_net(tester, dets, det_range, gpu_id): + dump_results = [] + + start_time = time.time() + + img_start = det_range[0] + img_id = 0 + img_id2 = 0 + count = 0 # 计数 + total = 360 + pbar = tqdm(total=det_range[1] - img_start - 1, position=gpu_id) # 进度条 + pbar.set_description("GPU %s" % str(gpu_id)) + while img_start < det_range[1]: + img_end = img_start + 1 + im_info = dets[img_start] + while img_end < det_range[1] and dets[img_end]['image_id'] == im_info['image_id']: + img_end += 1 + + # all human detection results of a certain image + cropped_data = dets[img_start:img_end] # 一个确定的图片中的所有human检测结果 + + pbar.update(img_end - img_start) + img_start = img_end + + kps_result = np.zeros((len(cropped_data), cfg.num_kps, 3)) + area_save = np.zeros(len(cropped_data)) + + # cluster human detection results with test_batch_size + # test_batch_size 改成 1 + for batch_id in range(0, len(cropped_data), 1): + start_id = batch_id + end_id = min(len(cropped_data), batch_id + 1) + + imgs = [] + crop_infos = [] + for i in range(start_id, end_id): + img, crop_info = generate_batch(cropped_data[i], stage='test') + imgs.append(img) + crop_infos.append(crop_info) + + imgs = np.array(imgs) + crop_infos = np.array(crop_infos) + + # forward + if 0 <= count < total: + heatmap = np.loadtxt(osp.join(msame_out_path, "{}_output_0.txt".format(count))) + heatmap = heatmap.reshape((1, 64, 48, 17)) + count += 1 + # print("count:", count) + + if cfg.flip_test: + flip_imgs = imgs[:, :, ::-1, :] + flip_heatmap = tester.predict_one([flip_imgs])[0] + + flip_heatmap = flip_heatmap[:, :, ::-1, :] + for (q, w) in cfg.kps_symmetry: + flip_heatmap_w, flip_heatmap_q = flip_heatmap[:, :, :, w].copy(), flip_heatmap[:, :, :, q].copy() + flip_heatmap[:, :, :, q], flip_heatmap[:, :, :, w] = flip_heatmap_w, flip_heatmap_q + flip_heatmap[:, :, 1:, :] = flip_heatmap.copy()[:, :, 0:-1, :] + heatmap += flip_heatmap + heatmap /= 2 + + # for each human detection from clustered batch + for image_id in range(start_id, end_id): + + for j in range(cfg.num_kps): + hm_j = heatmap[image_id - start_id, :, :, j] + idx = hm_j.argmax() + y, x = np.unravel_index(idx, hm_j.shape) + + px = int(math.floor(x + 0.5)) + py = int(math.floor(y + 0.5)) + if 1 < px < cfg.output_shape[1] - 1 and 1 < py < cfg.output_shape[0] - 1: + diff = np.array([hm_j[py][px + 1] - hm_j[py][px - 1], + hm_j[py + 1][px] - hm_j[py - 1][px]]) + diff = np.sign(diff) + x += diff[0] * .25 + y += diff[1] * .25 + kps_result[image_id, j, :2] = ( + x * cfg.input_shape[1] / cfg.output_shape[1], y * cfg.input_shape[0] / cfg.output_shape[0]) + kps_result[image_id, j, 2] = hm_j.max() / 255 + + # map back to original images + for j in range(cfg.num_kps): + kps_result[image_id, j, 0] = kps_result[image_id, j, 0] / cfg.input_shape[1] * ( + crop_infos[image_id - start_id][2] - crop_infos[image_id - start_id][0]) + \ + crop_infos[image_id - start_id][0] + kps_result[image_id, j, 1] = kps_result[image_id, j, 1] / cfg.input_shape[0] * ( + crop_infos[image_id - start_id][3] - crop_infos[image_id - start_id][1]) + \ + crop_infos[image_id - start_id][1] + + area_save[image_id] = (crop_infos[image_id - start_id][2] - crop_infos[image_id - start_id][0]) * ( + crop_infos[image_id - start_id][3] - crop_infos[image_id - start_id][1]) + + score_result = np.copy(kps_result[:, :, 2]) + kps_result[:, :, 2] = 1 + kps_result = kps_result.reshape(-1, cfg.num_kps * 3) + + # rescoring and oks nms + if cfg.dataset == 'COCO': + rescored_score = np.zeros((len(score_result))) + for i in range(len(score_result)): + score_mask = score_result[i] > cfg.score_thr + if np.sum(score_mask) > 0: + rescored_score[i] = np.mean(score_result[i][score_mask]) * cropped_data[i]['score'] + score_result = rescored_score + keep = oks_nms(kps_result, score_result, area_save, cfg.oks_nms_thr) + if len(keep) > 0: + kps_result = kps_result[keep, :] + score_result = score_result[keep] + area_save = area_save[keep] + elif cfg.dataset == 'PoseTrack': + keep = oks_nms(kps_result, np.mean(score_result, axis=1), area_save, cfg.oks_nms_thr) + if len(keep) > 0: + kps_result = kps_result[keep, :] + score_result = score_result[keep, :] + area_save = area_save[keep] + + # save result + for i in range(len(kps_result)): + if cfg.dataset == 'COCO': + result = dict(image_id=im_info['image_id'], category_id=1, score=float(round(score_result[i], 4)), + keypoints=kps_result[i].round(3).tolist()) + elif cfg.dataset == 'PoseTrack': + result = dict(image_id=im_info['image_id'], category_id=1, track_id=0, + scores=score_result[i].round(4).tolist(), + keypoints=kps_result[i].round(3).tolist()) + elif cfg.dataset == 'MPII': + result = dict(image_id=im_info['image_id'], scores=score_result[i].round(4).tolist(), + keypoints=kps_result[i].round(3).tolist()) + + dump_results.append(result) + + return dump_results + + +def test(test_model): + # annotation load + d = Dataset() + annot = d.load_annot(cfg.testset) # ground truth + gt_img_id = d.load_imgid(annot) # 得到图像id + + # human bbox load + if cfg.useGTbbox and cfg.testset in ['train', 'val']: + if cfg.testset == 'train': + dets = d.load_train_data(score=True) + else: + dets = d.load_val_data_with_annot() + dets.sort(key=lambda x: (x['image_id'])) + else: + with open(cfg.human_det_path, 'r') as f: + dets = json.load(f) + dets = [i for i in dets if i['image_id'] in gt_img_id] + dets = [i for i in dets if i['category_id'] == 1] + dets = [i for i in dets if i['score'] > 0] + dets.sort(key=lambda x: (x['image_id'], x['score']), reverse=True) + + img_id = [] + for i in dets: + img_id.append(i['image_id']) + imgname = d.imgid_to_imgname(annot, img_id, cfg.testset) # 得到图像名 + for i in range(len(dets)): + dets[i]['imgpath'] = imgname[i] # 把图像名作为一项加入dets + + # job assign (multi-gpu) + gpu_ids = "0" + from tfflat.mp_utils_my import MultiProc + img_start = 0 + ranges = [0] + + img_num = len(np.unique([i['image_id'] for i in dets])) + + images_per_gpu = int(img_num / len(gpu_ids.split(','))) + 1 + + for run_img in range(img_num): + img_end = img_start + 1 + while img_end < len(dets) and dets[img_end]['image_id'] == dets[img_start]['image_id']: + img_end += 1 + if (run_img + 1) % images_per_gpu == 0 or (run_img + 1) == img_num: + ranges.append(img_end) + img_start = img_end + print("ranges:", ranges) + + global func + + def func(gpu_id): # 修改 + # cfg.set_args(gpu_ids.split(',')[gpu_id]) + cfg.set_args() + tester = Tester(Model(), cfg) + tester.load_weights(test_model) + range = [ranges[gpu_id], ranges[gpu_id + 1]] + return test_net(tester, dets, range, gpu_id) + + MultiGPUFunc = MultiProc(len(gpu_ids.split(',')), func) + result = MultiGPUFunc.work() + + # evaluation + d.evaluation(result, annot, cfg.result_dir, cfg.testset) + + +if __name__ == '__main__': + (npu_sess, npu_shutdown) = init_resource() + test_epoch = 140 + test(test_epoch) + shutdown_resource(npu_sess, npu_shutdown) + close_session(npu_sess) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/test.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/test.py new file mode 100644 index 000000000..09530874c --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/main/test.py @@ -0,0 +1,267 @@ +from npu_bridge.npu_init import * +import os +import os.path as osp +import numpy as np +import argparse +from config import cfg +import cv2 +import sys +import time +import json +from PIL import Image +import matplotlib.pyplot as plt +import pickle +from tqdm import tqdm +import math + +import tensorflow as tf + +from tfflat.base import Tester +from tfflat.utils import mem_info +from model import Model + +from gen_batch import generate_batch +from dataset import Dataset +from nms.nms_my import oks_nms + +output_dir = "cache/result" + + +def test_net(tester, dets, det_range, gpu_id): + dump_results = [] + + start_time = time.time() + + img_start = det_range[0] + img_id = 0 + img_id2 = 0 + # 计数 + count = 0 + sum = 0 + pbar = tqdm(total=det_range[1] - img_start - 1, position=gpu_id) # 进度条 + pbar.set_description("GPU %s" % str(gpu_id)) + while img_start < det_range[1]: + img_end = img_start + 1 + im_info = dets[img_start] + while img_end < det_range[1] and dets[img_end]['image_id'] == im_info['image_id']: + img_end += 1 + + # all human detection results of a certain image + cropped_data = dets[img_start:img_end] # 一个确定的图片中的所有human检测结果 + + pbar.update(img_end - img_start) + img_start = img_end + + kps_result = np.zeros((len(cropped_data), cfg.num_kps, 3)) + area_save = np.zeros(len(cropped_data)) + + # cluster human detection results with test_batch_size + # test_batch_size 改成 1 + + sum += len(cropped_data) + for batch_id in range(0, len(cropped_data), 1): + start_id = batch_id + end_id = min(len(cropped_data), batch_id + 1) + + imgs = [] + crop_infos = [] + for i in range(start_id, end_id): + img, crop_info = generate_batch(cropped_data[i], stage='test') + imgs.append(img) + crop_infos.append(crop_info) + + image = np.array(imgs) + bin_path = osp.join(cfg.bins_dir, "{}.bin".format(count)) + image.tofile(bin_path) + count += 1 + + imgs = np.array(imgs) + crop_infos = np.array(crop_infos) + + # forward + heatmap = tester.predict_one([imgs])[0] + + if cfg.flip_test: + flip_imgs = imgs[:, :, ::-1, :] + flip_heatmap = tester.predict_one([flip_imgs])[0] + + flip_heatmap = flip_heatmap[:, :, ::-1, :] + for (q, w) in cfg.kps_symmetry: + flip_heatmap_w, flip_heatmap_q = flip_heatmap[:, :, :, w].copy(), flip_heatmap[:, :, :, q].copy() + flip_heatmap[:, :, :, q], flip_heatmap[:, :, :, w] = flip_heatmap_w, flip_heatmap_q + flip_heatmap[:, :, 1:, :] = flip_heatmap.copy()[:, :, 0:-1, :] + heatmap += flip_heatmap + heatmap /= 2 + + # for each human detection from clustered batch + for image_id in range(start_id, end_id): + + for j in range(cfg.num_kps): + hm_j = heatmap[image_id - start_id, :, :, j] + idx = hm_j.argmax() + y, x = np.unravel_index(idx, hm_j.shape) + + px = int(math.floor(x + 0.5)) + py = int(math.floor(y + 0.5)) + if 1 < px < cfg.output_shape[1] - 1 and 1 < py < cfg.output_shape[0] - 1: + diff = np.array([hm_j[py][px + 1] - hm_j[py][px - 1], + hm_j[py + 1][px] - hm_j[py - 1][px]]) + diff = np.sign(diff) + x += diff[0] * .25 + y += diff[1] * .25 + kps_result[image_id, j, :2] = ( + x * cfg.input_shape[1] / cfg.output_shape[1], y * cfg.input_shape[0] / cfg.output_shape[0]) + kps_result[image_id, j, 2] = hm_j.max() / 255 + + vis = False + crop_info = crop_infos[image_id - start_id, :] + area = (crop_info[2] - crop_info[0]) * (crop_info[3] - crop_info[1]) + if vis and np.any(kps_result[image_id, :, 2]) > 0.9 and area > 96 ** 2: + tmpimg = imgs[image_id - start_id].copy() + tmpimg = cfg.denormalize_input(tmpimg) + tmpimg = tmpimg.astype('uint8') + tmpkps = np.zeros((3, cfg.num_kps)) + tmpkps[:2, :] = kps_result[image_id, :, :2].transpose(1, 0) + tmpkps[2, :] = kps_result[image_id, :, 2] + _tmpimg = tmpimg.copy() + _tmpimg = cfg.vis_keypoints(_tmpimg, tmpkps) + cv2.imwrite(osp.join(cfg.vis_dir, str(img_id) + '_output.jpg'), _tmpimg) + img_id += 1 + + # map back to original images + for j in range(cfg.num_kps): + kps_result[image_id, j, 0] = kps_result[image_id, j, 0] / cfg.input_shape[1] * \ + (crop_infos[image_id - start_id][2] - crop_infos[image_id - start_id][ + 0]) + \ + crop_infos[image_id - start_id][0] + kps_result[image_id, j, 1] = kps_result[image_id, j, 1] / cfg.input_shape[0] * \ + (crop_infos[image_id - start_id][3] - crop_infos[image_id - start_id][ + 1]) + \ + crop_infos[image_id - start_id][1] + + area_save[image_id] = (crop_infos[image_id - start_id][2] - crop_infos[image_id - start_id][0]) * ( + crop_infos[image_id - start_id][3] - crop_infos[image_id - start_id][1]) + + # vis + vis = False + if vis and np.any(kps_result[:, :, 2] > 0.9): + tmpimg = cv2.imread(os.path.join(cfg.img_path, cropped_data[0]['imgpath'])) + tmpimg = tmpimg.astype('uint8') + for i in range(len(kps_result)): + tmpkps = np.zeros((3, cfg.num_kps)) + tmpkps[:2, :] = kps_result[i, :, :2].transpose(1, 0) + tmpkps[2, :] = kps_result[i, :, 2] + tmpimg = cfg.vis_keypoints(tmpimg, tmpkps) + cv2.imwrite(osp.join(cfg.vis_dir, str(img_id2) + '.jpg'), tmpimg) + img_id2 += 1 + + score_result = np.copy(kps_result[:, :, 2]) + kps_result[:, :, 2] = 1 + kps_result = kps_result.reshape(-1, cfg.num_kps * 3) + + # rescoring and oks nms + if cfg.dataset == 'COCO': + rescored_score = np.zeros((len(score_result))) + for i in range(len(score_result)): + score_mask = score_result[i] > cfg.score_thr + if np.sum(score_mask) > 0: + rescored_score[i] = np.mean(score_result[i][score_mask]) * cropped_data[i]['score'] + score_result = rescored_score + keep = oks_nms(kps_result, score_result, area_save, cfg.oks_nms_thr) + if len(keep) > 0: + kps_result = kps_result[keep, :] + score_result = score_result[keep] + area_save = area_save[keep] + elif cfg.dataset == 'PoseTrack': + keep = oks_nms(kps_result, np.mean(score_result, axis=1), area_save, cfg.oks_nms_thr) + if len(keep) > 0: + kps_result = kps_result[keep, :] + score_result = score_result[keep, :] + area_save = area_save[keep] + + # save result + for i in range(len(kps_result)): + if cfg.dataset == 'COCO': + result = dict(image_id=im_info['image_id'], category_id=1, score=float(round(score_result[i], 4)), + keypoints=kps_result[i].round(3).tolist()) + elif cfg.dataset == 'PoseTrack': + result = dict(image_id=im_info['image_id'], category_id=1, track_id=0, + scores=score_result[i].round(4).tolist(), + keypoints=kps_result[i].round(3).tolist()) + elif cfg.dataset == 'MPII': + result = dict(image_id=im_info['image_id'], scores=score_result[i].round(4).tolist(), + keypoints=kps_result[i].round(3).tolist()) + + dump_results.append(result) + + return dump_results + + +def test(test_model): + # annotation load + d = Dataset() + annot = d.load_annot(cfg.testset) # ground truth + gt_img_id = d.load_imgid(annot) # 得到图像id + + # human bbox load + if cfg.useGTbbox and cfg.testset in ['train', 'val']: + if cfg.testset == 'train': + dets = d.load_train_data(score=True) + else: + dets = d.load_val_data_with_annot() + dets.sort(key=lambda x: (x['image_id'])) + else: + with open(cfg.human_det_path, 'r') as f: + dets = json.load(f) + dets = [i for i in dets if i['image_id'] in gt_img_id] + dets = [i for i in dets if i['category_id'] == 1] + dets = [i for i in dets if i['score'] > 0] + dets.sort(key=lambda x: (x['image_id'], x['score']), reverse=True) + + img_id = [] + for i in dets: + img_id.append(i['image_id']) + imgname = d.imgid_to_imgname(annot, img_id, cfg.testset) # 得到图像名 + for i in range(len(dets)): + dets[i]['imgpath'] = imgname[i] # 把图像名作为一项加入dets + + # job assign (multi-gpu) + gpu_ids = "0" + from tfflat.mp_utils_my import MultiProc + img_start = 0 + ranges = [0] + + img_num = len(np.unique([i['image_id'] for i in dets])) + + images_per_gpu = int(img_num / len(gpu_ids.split(','))) + 1 + + for run_img in range(img_num): + img_end = img_start + 1 + while img_end < len(dets) and dets[img_end]['image_id'] == dets[img_start]['image_id']: + img_end += 1 + if (run_img + 1) % images_per_gpu == 0 or (run_img + 1) == img_num: + ranges.append(img_end) + img_start = img_end + + global func + + def func(gpu_id): + cfg.set_args() + tester = Tester(Model(), cfg) + tester.load_weights(test_model) + range = [ranges[gpu_id], ranges[gpu_id + 1]] + return test_net(tester, dets, range, gpu_id) + + MultiGPUFunc = MultiProc(len(gpu_ids.split(',')), func) + result = MultiGPUFunc.work() + + # evaluation + d.evaluation(result, annot, cfg.result_dir, cfg.testset) + + +if __name__ == '__main__': + (npu_sess, npu_shutdown) = init_resource() + test_epoch = 140 + test(test_epoch) + shutdown_resource(npu_sess, npu_shutdown) + close_session(npu_sess) -- Gitee From 5de694d4f0bbdacfed387f8713cfcf032cdf4fbb Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 14:18:34 +0000 Subject: [PATCH 29/59] add ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md. --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md new file mode 100644 index 000000000..e69de29bb -- Gitee From 936e6b9f89b1f86fc68d7ad0860a9d3149095b03 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 14:30:02 +0000 Subject: [PATCH 30/59] update ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md. --- .../src/README.md | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md index e69de29bb..c43e39177 100644 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md @@ -0,0 +1,45 @@ +## SimpleHumanPose +### 基本信息 + +**发布者(Publisher):Huawei** + +**应用领域(Application Domain):Human Pose Estimation** + +**版本(Version):1.0** + +**修改时间(Modified) :2022.05.23** + +**框架(Framework):TensorFlow 1.15.0** + +**处理器(Processor):昇腾910** + +**应用级别(Categories):Benchmark** + +**描述(Description):基于TensorFlow框架的SimpleHumanPose网络离线推理代码** + +### 概述 + +SimpleHumanPose模型主要针对人体姿态估计和姿态追踪,提出一种简化的baseline。当前流行的人体姿态估计方法都过于复杂,各种模型在结构上看起来差异性很大,但是性能上又很接近,很难判断究竟是什么在起作用。相比于其他人体姿态估计模型,该模型并没有使用过多的技巧和理论依据。它以简单的技术为基础,通过全面的消融实验进行了验证,提出一个较为简化直观的模型,取得了良好的性能。 + +- 参考论文: + + https://arxiv.org/abs/1804.06208 + +- 参考实现: + + https://github.com/mks0601/TF-SimpleHumanPose + +### 文件结构 +```bash +├── README.md //代码说明文档 +├── LICENSE //许可证 +├── src +| ├── boot_pb_frozen.py //ModelArts启动pb固化代码 +| ├── boot_inference.py //ModelArts启动计算精度代码 +| ├── boot_test.py //ModelArts启动测试代码 +| ├── pip-requirements.txt //配置文件,用于指定依赖包的包名及版本号 +│ ├── data //包含数据加载代码 +│ ├── lib //包含2D多人姿态估计系统的核心代码 +│ ├── main //包含train/test网络、ckpt转pb、数据集转bin等代码 +``` + -- Gitee From f8f064dc090ba08661ee51d0a51a6d960e795a68 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 14:31:29 +0000 Subject: [PATCH 31/59] add ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md. --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md new file mode 100644 index 000000000..e69de29bb -- Gitee From a4b6e57140eaede6e5f1b24f9aa4d9abc4a4fe12 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 14:32:10 +0000 Subject: [PATCH 32/59] update README.md. --- .../SimpleHumanPose_ID0956_for_ACL/README.md | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md index e69de29bb..c43e39177 100644 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md @@ -0,0 +1,45 @@ +## SimpleHumanPose +### 基本信息 + +**发布者(Publisher):Huawei** + +**应用领域(Application Domain):Human Pose Estimation** + +**版本(Version):1.0** + +**修改时间(Modified) :2022.05.23** + +**框架(Framework):TensorFlow 1.15.0** + +**处理器(Processor):昇腾910** + +**应用级别(Categories):Benchmark** + +**描述(Description):基于TensorFlow框架的SimpleHumanPose网络离线推理代码** + +### 概述 + +SimpleHumanPose模型主要针对人体姿态估计和姿态追踪,提出一种简化的baseline。当前流行的人体姿态估计方法都过于复杂,各种模型在结构上看起来差异性很大,但是性能上又很接近,很难判断究竟是什么在起作用。相比于其他人体姿态估计模型,该模型并没有使用过多的技巧和理论依据。它以简单的技术为基础,通过全面的消融实验进行了验证,提出一个较为简化直观的模型,取得了良好的性能。 + +- 参考论文: + + https://arxiv.org/abs/1804.06208 + +- 参考实现: + + https://github.com/mks0601/TF-SimpleHumanPose + +### 文件结构 +```bash +├── README.md //代码说明文档 +├── LICENSE //许可证 +├── src +| ├── boot_pb_frozen.py //ModelArts启动pb固化代码 +| ├── boot_inference.py //ModelArts启动计算精度代码 +| ├── boot_test.py //ModelArts启动测试代码 +| ├── pip-requirements.txt //配置文件,用于指定依赖包的包名及版本号 +│ ├── data //包含数据加载代码 +│ ├── lib //包含2D多人姿态估计系统的核心代码 +│ ├── main //包含train/test网络、ckpt转pb、数据集转bin等代码 +``` + -- Gitee From 15c8f5e369bc6af2da47b3cd3c74ee1c5722d6d4 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 14:32:24 +0000 Subject: [PATCH 33/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/README.md | 45 ------------------- 1 file changed, 45 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md deleted file mode 100644 index c43e39177..000000000 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/README.md +++ /dev/null @@ -1,45 +0,0 @@ -## SimpleHumanPose -### 基本信息 - -**发布者(Publisher):Huawei** - -**应用领域(Application Domain):Human Pose Estimation** - -**版本(Version):1.0** - -**修改时间(Modified) :2022.05.23** - -**框架(Framework):TensorFlow 1.15.0** - -**处理器(Processor):昇腾910** - -**应用级别(Categories):Benchmark** - -**描述(Description):基于TensorFlow框架的SimpleHumanPose网络离线推理代码** - -### 概述 - -SimpleHumanPose模型主要针对人体姿态估计和姿态追踪,提出一种简化的baseline。当前流行的人体姿态估计方法都过于复杂,各种模型在结构上看起来差异性很大,但是性能上又很接近,很难判断究竟是什么在起作用。相比于其他人体姿态估计模型,该模型并没有使用过多的技巧和理论依据。它以简单的技术为基础,通过全面的消融实验进行了验证,提出一个较为简化直观的模型,取得了良好的性能。 - -- 参考论文: - - https://arxiv.org/abs/1804.06208 - -- 参考实现: - - https://github.com/mks0601/TF-SimpleHumanPose - -### 文件结构 -```bash -├── README.md //代码说明文档 -├── LICENSE //许可证 -├── src -| ├── boot_pb_frozen.py //ModelArts启动pb固化代码 -| ├── boot_inference.py //ModelArts启动计算精度代码 -| ├── boot_test.py //ModelArts启动测试代码 -| ├── pip-requirements.txt //配置文件,用于指定依赖包的包名及版本号 -│ ├── data //包含数据加载代码 -│ ├── lib //包含2D多人姿态估计系统的核心代码 -│ ├── main //包含train/test网络、ckpt转pb、数据集转bin等代码 -``` - -- Gitee From 797458840ad75d6f5656b2f0ecd100a9b8206949 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 14:32:45 +0000 Subject: [PATCH 34/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 0789a064f32527f82c47e54b3abf4d32323c7335 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 14:32:57 +0000 Subject: [PATCH 35/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 4891d501857f3560e83dc78e88f7a8f02a28780e Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 14:34:04 +0000 Subject: [PATCH 36/59] update ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md. --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md index c43e39177..4655dbec5 100644 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md @@ -34,12 +34,12 @@ SimpleHumanPose模型主要针对人体姿态估计和姿态追踪,提出一 ├── README.md //代码说明文档 ├── LICENSE //许可证 ├── src +│ ├── data //包含数据加载代码 +│ ├── lib //包含2D多人姿态估计系统的核心代码 +│ ├── main //包含train/test网络、ckpt转pb、数据集转bin等代码 | ├── boot_pb_frozen.py //ModelArts启动pb固化代码 | ├── boot_inference.py //ModelArts启动计算精度代码 | ├── boot_test.py //ModelArts启动测试代码 -| ├── pip-requirements.txt //配置文件,用于指定依赖包的包名及版本号 -│ ├── data //包含数据加载代码 -│ ├── lib //包含2D多人姿态估计系统的核心代码 -│ ├── main //包含train/test网络、ckpt转pb、数据集转bin等代码 +| ├── pip-requirements.txt //配置文件,用于指定依赖包的包名及版本号 ``` -- Gitee From 57bfea5704d995ead1875c1ca588a6d8c89f6ebc Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Mon, 23 May 2022 14:35:18 +0000 Subject: [PATCH 37/59] update ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md. --- .../cv/SimpleHumanPose_ID0956_for_ACL/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md index 4655dbec5..0ba36ccdb 100644 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md @@ -34,12 +34,12 @@ SimpleHumanPose模型主要针对人体姿态估计和姿态追踪,提出一 ├── README.md //代码说明文档 ├── LICENSE //许可证 ├── src -│ ├── data //包含数据加载代码 -│ ├── lib //包含2D多人姿态估计系统的核心代码 -│ ├── main //包含train/test网络、ckpt转pb、数据集转bin等代码 -| ├── boot_pb_frozen.py //ModelArts启动pb固化代码 -| ├── boot_inference.py //ModelArts启动计算精度代码 -| ├── boot_test.py //ModelArts启动测试代码 -| ├── pip-requirements.txt //配置文件,用于指定依赖包的包名及版本号 +│ ├── data/ //包含数据加载代码 +│ ├── lib/ //包含2D多人姿态估计系统的核心代码 +│ ├── main/ //包含train/test网络、ckpt转pb、数据集转bin等代码 +| ├── boot_pb_frozen.py //ModelArts启动pb固化代码 +| ├── boot_inference.py //ModelArts启动计算精度代码 +| ├── boot_test.py //ModelArts启动测试代码 +| ├── pip-requirements.txt //配置文件,用于指定依赖包的包名及版本号 ``` -- Gitee From eab0daacc5b2bf94ed1e4ac554c612a55224a676 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:18:50 +0000 Subject: [PATCH 38/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20COCO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 77621a196bd01af6da5d357305c334ad88ec9b97 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:19:08 +0000 Subject: [PATCH 39/59] first commit --- .../src/data/COCO/dataset.py | 197 ++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py new file mode 100644 index 000000000..4b78780ca --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py @@ -0,0 +1,197 @@ +#!/usr/bin/python3 +# coding=utf-8 + +from npu_bridge.npu_init import * +import os +import os.path as osp +import numpy as np +import cv2 +import json +import pickle +import matplotlib.pyplot as plt +import tensorflow as tf + +import sys + +current_path = os.path.dirname(os.path.realpath(__file__)) # 对应于COCO +project_root = os.path.dirname(os.path.dirname(current_path)) # 对应于TF-Simple +main_path = os.path.join(project_root, "main", "train.py") +print("main_path:", main_path) + + +cur_dir = os.path.dirname(__file__) +# print("========>>>>>>cur_dir:{}".format(cur_dir)) +sys.path.insert(0, osp.join(cur_dir, 'PythonAPI')) +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval + + +class Dataset(object): + dataset_name = 'COCO' + num_kps = 17 + kps_names = ['nose', 'l_eye', 'r_eye', 'l_ear', 'r_ear', 'l_shoulder', + 'r_shoulder', 'l_elbow', 'r_elbow', 'l_wrist', 'r_wrist', + 'l_hip', 'r_hip', 'l_knee', 'r_knee', 'l_ankle', 'r_ankle'] + kps_symmetry = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (15, 16)] + kps_lines = [(1, 2), (0, 1), (0, 2), (2, 4), (1, 3), (6, 8), (8, 10), (5, 7), (7, 9), (12, 14), (14, 16), (11, 13), + (13, 15), (5, 6), (11, 12)] + + # human_det_path = osp.join('..', 'data', dataset_name, 'dets', 'human_detection.json') # human detection result + # img_path = osp.join('..', 'data', dataset_name, 'images') + # train_annot_path = osp.join('..', 'data', dataset_name, 'annotations', 'person_keypoints_train2017.json') + # train_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_train2017.json') + # val_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_val2017.json') + # test_annot_path = osp.join(cur_dir, 'data', dataset_name, 'annotations', 'image_info_test-dev2017.json') + + # tf_flags = tf.app.flags.FLAGS + data_path = "cache/dataset" + img_path = osp.join(data_path, 'images') + human_det_path = osp.join(data_path, 'dets', 'human_detection.json') + train_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_train2017.json') + val_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_val2017.json') + test_annot_path = osp.join(data_path, 'annotations', 'image_info_test-dev2017.json') + + def load_train_data(self, score=False): + coco = COCO(self.train_annot_path) + train_data = [] + for aid in coco.anns.keys(): + ann = coco.anns[aid] + imgname = 'train2017/' + coco.imgs[ann['image_id']]['file_name'] + joints = ann['keypoints'] + + if (ann['image_id'] not in coco.imgs) or ann['iscrowd'] or (np.sum(joints[2::3]) == 0) or ( + ann['num_keypoints'] == 0): + continue + + # sanitize bboxes + x, y, w, h = ann['bbox'] + img = coco.loadImgs(ann['image_id'])[0] + width, height = img['width'], img['height'] + 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 ann['area'] > 0 and x2 >= x1 and y2 >= y1: + bbox = [x1, y1, x2 - x1, y2 - y1] + else: + continue + + if score: + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) + else: + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints) + + train_data.append(data) + + return train_data + + def load_val_data_with_annot(self): + coco = COCO(self.val_annot_path) + val_data = [] + for aid in coco.anns.keys(): + ann = coco.anns[aid] + if ann['image_id'] not in coco.imgs: + continue + imgname = 'val2017/' + coco.imgs[ann['image_id']]['file_name'] + bbox = ann['bbox'] + joints = ann['keypoints'] + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) + val_data.append(data) + + return val_data + + def load_annot(self, db_set): + if db_set == 'train': + coco = COCO(self.train_annot_path) + elif db_set == 'val': + coco = COCO(self.val_annot_path) + elif db_set == 'test': + coco = COCO(self.test_annot_path) + else: + print('Unknown db_set') + assert 0 + + return coco + + def load_imgid(self, annot): + return annot.imgs + + def imgid_to_imgname(self, annot, imgid, db_set): + imgs = annot.loadImgs(imgid) + imgname = [db_set + '2017/' + i['file_name'] for i in imgs] + return imgname + + def evaluation(self, result, gt, result_dir, db_set): + result_path = osp.join(result_dir, 'result.json') + with open(result_path, 'w') as f: + json.dump(result, f) # 把result中的东西写到result.json里面 + + result = gt.loadRes(result_path) + cocoEval = COCOeval(gt, result, iouType='keypoints') + + cocoEval.evaluate() + cocoEval.accumulate() + cocoEval.summarize() + + result_path = osp.join(result_dir, 'result.pkl') + with open(result_path, 'wb') as f: + pickle.dump(cocoEval, f, 2) + print("Saved result file to " + result_path) + + def vis_keypoints(self, img, kps, kp_thresh=0.4, alpha=1): + + # Convert from plt 0-1 RGBA colors to 0-255 BGR colors for opencv. + cmap = plt.get_cmap('rainbow') + colors = [cmap(i) for i in np.linspace(0, 1, len(self.kps_lines) + 2)] + colors = [(c[2] * 255, c[1] * 255, c[0] * 255) for c in colors] + + # Perform the drawing on a copy of the image, to allow for blending. + kp_mask = np.copy(img) + + # Draw mid shoulder / mid hip first for better visualization. + mid_shoulder = ( + kps[:2, 5] + + kps[:2, 6]) / 2.0 + sc_mid_shoulder = np.minimum( + kps[2, 5], + kps[2, 6]) + mid_hip = ( + kps[:2, 11] + + kps[:2, 12]) / 2.0 + sc_mid_hip = np.minimum( + kps[2, 11], + kps[2, 12]) + nose_idx = 0 + if sc_mid_shoulder > kp_thresh and kps[2, nose_idx] > kp_thresh: + cv2.line( + kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(kps[:2, nose_idx].astype(np.int32)), + color=colors[len(self.kps_lines)], thickness=2, lineType=cv2.LINE_AA) + if sc_mid_shoulder > kp_thresh and sc_mid_hip > kp_thresh: + cv2.line( + kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(mid_hip.astype(np.int32)), + color=colors[len(self.kps_lines) + 1], thickness=2, lineType=cv2.LINE_AA) + + # Draw the keypoints. + for l in range(len(self.kps_lines)): + i1 = self.kps_lines[l][0] + i2 = self.kps_lines[l][1] + p1 = kps[0, i1].astype(np.int32), kps[1, i1].astype(np.int32) + p2 = kps[0, i2].astype(np.int32), kps[1, i2].astype(np.int32) + if kps[2, i1] > kp_thresh and kps[2, i2] > kp_thresh: + cv2.line( + kp_mask, p1, p2, + color=colors[l], thickness=2, lineType=cv2.LINE_AA) + if kps[2, i1] > kp_thresh: + cv2.circle( + kp_mask, p1, + radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) + if kps[2, i2] > kp_thresh: + cv2.circle( + kp_mask, p2, + radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) + + # Blend the keypoints. + return cv2.addWeighted(img, 1.0 - alpha, kp_mask, alpha, 0) + + +dbcfg = Dataset() -- Gitee From 0f3d78db1a94afb77ac571ca25da82f5df8e88be Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:19:15 +0000 Subject: [PATCH 40/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/data/COCO/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From c4335668d4202d8ae33347f63f0a8179bc7c4ea2 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:19:29 +0000 Subject: [PATCH 41/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/data/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 1f8200c0e659e80f7f11cc3081ada09be9aae783 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:19:37 +0000 Subject: [PATCH 42/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/data/dataset.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/data/dataset.py | 197 ------------------ 1 file changed, 197 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/dataset.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/dataset.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/dataset.py deleted file mode 100644 index 4b78780ca..000000000 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/dataset.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/python3 -# coding=utf-8 - -from npu_bridge.npu_init import * -import os -import os.path as osp -import numpy as np -import cv2 -import json -import pickle -import matplotlib.pyplot as plt -import tensorflow as tf - -import sys - -current_path = os.path.dirname(os.path.realpath(__file__)) # 对应于COCO -project_root = os.path.dirname(os.path.dirname(current_path)) # 对应于TF-Simple -main_path = os.path.join(project_root, "main", "train.py") -print("main_path:", main_path) - - -cur_dir = os.path.dirname(__file__) -# print("========>>>>>>cur_dir:{}".format(cur_dir)) -sys.path.insert(0, osp.join(cur_dir, 'PythonAPI')) -from pycocotools.coco import COCO -from pycocotools.cocoeval import COCOeval - - -class Dataset(object): - dataset_name = 'COCO' - num_kps = 17 - kps_names = ['nose', 'l_eye', 'r_eye', 'l_ear', 'r_ear', 'l_shoulder', - 'r_shoulder', 'l_elbow', 'r_elbow', 'l_wrist', 'r_wrist', - 'l_hip', 'r_hip', 'l_knee', 'r_knee', 'l_ankle', 'r_ankle'] - kps_symmetry = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (15, 16)] - kps_lines = [(1, 2), (0, 1), (0, 2), (2, 4), (1, 3), (6, 8), (8, 10), (5, 7), (7, 9), (12, 14), (14, 16), (11, 13), - (13, 15), (5, 6), (11, 12)] - - # human_det_path = osp.join('..', 'data', dataset_name, 'dets', 'human_detection.json') # human detection result - # img_path = osp.join('..', 'data', dataset_name, 'images') - # train_annot_path = osp.join('..', 'data', dataset_name, 'annotations', 'person_keypoints_train2017.json') - # train_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_train2017.json') - # val_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_val2017.json') - # test_annot_path = osp.join(cur_dir, 'data', dataset_name, 'annotations', 'image_info_test-dev2017.json') - - # tf_flags = tf.app.flags.FLAGS - data_path = "cache/dataset" - img_path = osp.join(data_path, 'images') - human_det_path = osp.join(data_path, 'dets', 'human_detection.json') - train_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_train2017.json') - val_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_val2017.json') - test_annot_path = osp.join(data_path, 'annotations', 'image_info_test-dev2017.json') - - def load_train_data(self, score=False): - coco = COCO(self.train_annot_path) - train_data = [] - for aid in coco.anns.keys(): - ann = coco.anns[aid] - imgname = 'train2017/' + coco.imgs[ann['image_id']]['file_name'] - joints = ann['keypoints'] - - if (ann['image_id'] not in coco.imgs) or ann['iscrowd'] or (np.sum(joints[2::3]) == 0) or ( - ann['num_keypoints'] == 0): - continue - - # sanitize bboxes - x, y, w, h = ann['bbox'] - img = coco.loadImgs(ann['image_id'])[0] - width, height = img['width'], img['height'] - 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 ann['area'] > 0 and x2 >= x1 and y2 >= y1: - bbox = [x1, y1, x2 - x1, y2 - y1] - else: - continue - - if score: - data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) - else: - data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints) - - train_data.append(data) - - return train_data - - def load_val_data_with_annot(self): - coco = COCO(self.val_annot_path) - val_data = [] - for aid in coco.anns.keys(): - ann = coco.anns[aid] - if ann['image_id'] not in coco.imgs: - continue - imgname = 'val2017/' + coco.imgs[ann['image_id']]['file_name'] - bbox = ann['bbox'] - joints = ann['keypoints'] - data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) - val_data.append(data) - - return val_data - - def load_annot(self, db_set): - if db_set == 'train': - coco = COCO(self.train_annot_path) - elif db_set == 'val': - coco = COCO(self.val_annot_path) - elif db_set == 'test': - coco = COCO(self.test_annot_path) - else: - print('Unknown db_set') - assert 0 - - return coco - - def load_imgid(self, annot): - return annot.imgs - - def imgid_to_imgname(self, annot, imgid, db_set): - imgs = annot.loadImgs(imgid) - imgname = [db_set + '2017/' + i['file_name'] for i in imgs] - return imgname - - def evaluation(self, result, gt, result_dir, db_set): - result_path = osp.join(result_dir, 'result.json') - with open(result_path, 'w') as f: - json.dump(result, f) # 把result中的东西写到result.json里面 - - result = gt.loadRes(result_path) - cocoEval = COCOeval(gt, result, iouType='keypoints') - - cocoEval.evaluate() - cocoEval.accumulate() - cocoEval.summarize() - - result_path = osp.join(result_dir, 'result.pkl') - with open(result_path, 'wb') as f: - pickle.dump(cocoEval, f, 2) - print("Saved result file to " + result_path) - - def vis_keypoints(self, img, kps, kp_thresh=0.4, alpha=1): - - # Convert from plt 0-1 RGBA colors to 0-255 BGR colors for opencv. - cmap = plt.get_cmap('rainbow') - colors = [cmap(i) for i in np.linspace(0, 1, len(self.kps_lines) + 2)] - colors = [(c[2] * 255, c[1] * 255, c[0] * 255) for c in colors] - - # Perform the drawing on a copy of the image, to allow for blending. - kp_mask = np.copy(img) - - # Draw mid shoulder / mid hip first for better visualization. - mid_shoulder = ( - kps[:2, 5] + - kps[:2, 6]) / 2.0 - sc_mid_shoulder = np.minimum( - kps[2, 5], - kps[2, 6]) - mid_hip = ( - kps[:2, 11] + - kps[:2, 12]) / 2.0 - sc_mid_hip = np.minimum( - kps[2, 11], - kps[2, 12]) - nose_idx = 0 - if sc_mid_shoulder > kp_thresh and kps[2, nose_idx] > kp_thresh: - cv2.line( - kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(kps[:2, nose_idx].astype(np.int32)), - color=colors[len(self.kps_lines)], thickness=2, lineType=cv2.LINE_AA) - if sc_mid_shoulder > kp_thresh and sc_mid_hip > kp_thresh: - cv2.line( - kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(mid_hip.astype(np.int32)), - color=colors[len(self.kps_lines) + 1], thickness=2, lineType=cv2.LINE_AA) - - # Draw the keypoints. - for l in range(len(self.kps_lines)): - i1 = self.kps_lines[l][0] - i2 = self.kps_lines[l][1] - p1 = kps[0, i1].astype(np.int32), kps[1, i1].astype(np.int32) - p2 = kps[0, i2].astype(np.int32), kps[1, i2].astype(np.int32) - if kps[2, i1] > kp_thresh and kps[2, i2] > kp_thresh: - cv2.line( - kp_mask, p1, p2, - color=colors[l], thickness=2, lineType=cv2.LINE_AA) - if kps[2, i1] > kp_thresh: - cv2.circle( - kp_mask, p1, - radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) - if kps[2, i2] > kp_thresh: - cv2.circle( - kp_mask, p2, - radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) - - # Blend the keypoints. - return cv2.addWeighted(img, 1.0 - alpha, kp_mask, alpha, 0) - - -dbcfg = Dataset() -- Gitee From 8f19e4ee8c0f962040035c03eb8cf776e864c9e7 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:19:58 +0000 Subject: [PATCH 43/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/data/COCO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/data/COCO/dataset.py | 197 ------------------ 1 file changed, 197 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py deleted file mode 100644 index 4b78780ca..000000000 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/python3 -# coding=utf-8 - -from npu_bridge.npu_init import * -import os -import os.path as osp -import numpy as np -import cv2 -import json -import pickle -import matplotlib.pyplot as plt -import tensorflow as tf - -import sys - -current_path = os.path.dirname(os.path.realpath(__file__)) # 对应于COCO -project_root = os.path.dirname(os.path.dirname(current_path)) # 对应于TF-Simple -main_path = os.path.join(project_root, "main", "train.py") -print("main_path:", main_path) - - -cur_dir = os.path.dirname(__file__) -# print("========>>>>>>cur_dir:{}".format(cur_dir)) -sys.path.insert(0, osp.join(cur_dir, 'PythonAPI')) -from pycocotools.coco import COCO -from pycocotools.cocoeval import COCOeval - - -class Dataset(object): - dataset_name = 'COCO' - num_kps = 17 - kps_names = ['nose', 'l_eye', 'r_eye', 'l_ear', 'r_ear', 'l_shoulder', - 'r_shoulder', 'l_elbow', 'r_elbow', 'l_wrist', 'r_wrist', - 'l_hip', 'r_hip', 'l_knee', 'r_knee', 'l_ankle', 'r_ankle'] - kps_symmetry = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (15, 16)] - kps_lines = [(1, 2), (0, 1), (0, 2), (2, 4), (1, 3), (6, 8), (8, 10), (5, 7), (7, 9), (12, 14), (14, 16), (11, 13), - (13, 15), (5, 6), (11, 12)] - - # human_det_path = osp.join('..', 'data', dataset_name, 'dets', 'human_detection.json') # human detection result - # img_path = osp.join('..', 'data', dataset_name, 'images') - # train_annot_path = osp.join('..', 'data', dataset_name, 'annotations', 'person_keypoints_train2017.json') - # train_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_train2017.json') - # val_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_val2017.json') - # test_annot_path = osp.join(cur_dir, 'data', dataset_name, 'annotations', 'image_info_test-dev2017.json') - - # tf_flags = tf.app.flags.FLAGS - data_path = "cache/dataset" - img_path = osp.join(data_path, 'images') - human_det_path = osp.join(data_path, 'dets', 'human_detection.json') - train_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_train2017.json') - val_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_val2017.json') - test_annot_path = osp.join(data_path, 'annotations', 'image_info_test-dev2017.json') - - def load_train_data(self, score=False): - coco = COCO(self.train_annot_path) - train_data = [] - for aid in coco.anns.keys(): - ann = coco.anns[aid] - imgname = 'train2017/' + coco.imgs[ann['image_id']]['file_name'] - joints = ann['keypoints'] - - if (ann['image_id'] not in coco.imgs) or ann['iscrowd'] or (np.sum(joints[2::3]) == 0) or ( - ann['num_keypoints'] == 0): - continue - - # sanitize bboxes - x, y, w, h = ann['bbox'] - img = coco.loadImgs(ann['image_id'])[0] - width, height = img['width'], img['height'] - 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 ann['area'] > 0 and x2 >= x1 and y2 >= y1: - bbox = [x1, y1, x2 - x1, y2 - y1] - else: - continue - - if score: - data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) - else: - data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints) - - train_data.append(data) - - return train_data - - def load_val_data_with_annot(self): - coco = COCO(self.val_annot_path) - val_data = [] - for aid in coco.anns.keys(): - ann = coco.anns[aid] - if ann['image_id'] not in coco.imgs: - continue - imgname = 'val2017/' + coco.imgs[ann['image_id']]['file_name'] - bbox = ann['bbox'] - joints = ann['keypoints'] - data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) - val_data.append(data) - - return val_data - - def load_annot(self, db_set): - if db_set == 'train': - coco = COCO(self.train_annot_path) - elif db_set == 'val': - coco = COCO(self.val_annot_path) - elif db_set == 'test': - coco = COCO(self.test_annot_path) - else: - print('Unknown db_set') - assert 0 - - return coco - - def load_imgid(self, annot): - return annot.imgs - - def imgid_to_imgname(self, annot, imgid, db_set): - imgs = annot.loadImgs(imgid) - imgname = [db_set + '2017/' + i['file_name'] for i in imgs] - return imgname - - def evaluation(self, result, gt, result_dir, db_set): - result_path = osp.join(result_dir, 'result.json') - with open(result_path, 'w') as f: - json.dump(result, f) # 把result中的东西写到result.json里面 - - result = gt.loadRes(result_path) - cocoEval = COCOeval(gt, result, iouType='keypoints') - - cocoEval.evaluate() - cocoEval.accumulate() - cocoEval.summarize() - - result_path = osp.join(result_dir, 'result.pkl') - with open(result_path, 'wb') as f: - pickle.dump(cocoEval, f, 2) - print("Saved result file to " + result_path) - - def vis_keypoints(self, img, kps, kp_thresh=0.4, alpha=1): - - # Convert from plt 0-1 RGBA colors to 0-255 BGR colors for opencv. - cmap = plt.get_cmap('rainbow') - colors = [cmap(i) for i in np.linspace(0, 1, len(self.kps_lines) + 2)] - colors = [(c[2] * 255, c[1] * 255, c[0] * 255) for c in colors] - - # Perform the drawing on a copy of the image, to allow for blending. - kp_mask = np.copy(img) - - # Draw mid shoulder / mid hip first for better visualization. - mid_shoulder = ( - kps[:2, 5] + - kps[:2, 6]) / 2.0 - sc_mid_shoulder = np.minimum( - kps[2, 5], - kps[2, 6]) - mid_hip = ( - kps[:2, 11] + - kps[:2, 12]) / 2.0 - sc_mid_hip = np.minimum( - kps[2, 11], - kps[2, 12]) - nose_idx = 0 - if sc_mid_shoulder > kp_thresh and kps[2, nose_idx] > kp_thresh: - cv2.line( - kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(kps[:2, nose_idx].astype(np.int32)), - color=colors[len(self.kps_lines)], thickness=2, lineType=cv2.LINE_AA) - if sc_mid_shoulder > kp_thresh and sc_mid_hip > kp_thresh: - cv2.line( - kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(mid_hip.astype(np.int32)), - color=colors[len(self.kps_lines) + 1], thickness=2, lineType=cv2.LINE_AA) - - # Draw the keypoints. - for l in range(len(self.kps_lines)): - i1 = self.kps_lines[l][0] - i2 = self.kps_lines[l][1] - p1 = kps[0, i1].astype(np.int32), kps[1, i1].astype(np.int32) - p2 = kps[0, i2].astype(np.int32), kps[1, i2].astype(np.int32) - if kps[2, i1] > kp_thresh and kps[2, i2] > kp_thresh: - cv2.line( - kp_mask, p1, p2, - color=colors[l], thickness=2, lineType=cv2.LINE_AA) - if kps[2, i1] > kp_thresh: - cv2.circle( - kp_mask, p1, - radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) - if kps[2, i2] > kp_thresh: - cv2.circle( - kp_mask, p2, - radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) - - # Blend the keypoints. - return cv2.addWeighted(img, 1.0 - alpha, kp_mask, alpha, 0) - - -dbcfg = Dataset() -- Gitee From 004e05eab4e46c4163b0756c2938b37db4e7b782 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:20:06 +0000 Subject: [PATCH 44/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From c17d2c396ea696f297aefdfbc2053cc28a47c751 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:20:17 +0000 Subject: [PATCH 45/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20COCO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From 7ea87ca551d53359d721c765304fc25bfbd2baca Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:20:32 +0000 Subject: [PATCH 46/59] first commit --- .../src/data/COCO/dataset.py | 197 ++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py new file mode 100644 index 000000000..4b78780ca --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py @@ -0,0 +1,197 @@ +#!/usr/bin/python3 +# coding=utf-8 + +from npu_bridge.npu_init import * +import os +import os.path as osp +import numpy as np +import cv2 +import json +import pickle +import matplotlib.pyplot as plt +import tensorflow as tf + +import sys + +current_path = os.path.dirname(os.path.realpath(__file__)) # 对应于COCO +project_root = os.path.dirname(os.path.dirname(current_path)) # 对应于TF-Simple +main_path = os.path.join(project_root, "main", "train.py") +print("main_path:", main_path) + + +cur_dir = os.path.dirname(__file__) +# print("========>>>>>>cur_dir:{}".format(cur_dir)) +sys.path.insert(0, osp.join(cur_dir, 'PythonAPI')) +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval + + +class Dataset(object): + dataset_name = 'COCO' + num_kps = 17 + kps_names = ['nose', 'l_eye', 'r_eye', 'l_ear', 'r_ear', 'l_shoulder', + 'r_shoulder', 'l_elbow', 'r_elbow', 'l_wrist', 'r_wrist', + 'l_hip', 'r_hip', 'l_knee', 'r_knee', 'l_ankle', 'r_ankle'] + kps_symmetry = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (15, 16)] + kps_lines = [(1, 2), (0, 1), (0, 2), (2, 4), (1, 3), (6, 8), (8, 10), (5, 7), (7, 9), (12, 14), (14, 16), (11, 13), + (13, 15), (5, 6), (11, 12)] + + # human_det_path = osp.join('..', 'data', dataset_name, 'dets', 'human_detection.json') # human detection result + # img_path = osp.join('..', 'data', dataset_name, 'images') + # train_annot_path = osp.join('..', 'data', dataset_name, 'annotations', 'person_keypoints_train2017.json') + # train_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_train2017.json') + # val_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_val2017.json') + # test_annot_path = osp.join(cur_dir, 'data', dataset_name, 'annotations', 'image_info_test-dev2017.json') + + # tf_flags = tf.app.flags.FLAGS + data_path = "cache/dataset" + img_path = osp.join(data_path, 'images') + human_det_path = osp.join(data_path, 'dets', 'human_detection.json') + train_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_train2017.json') + val_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_val2017.json') + test_annot_path = osp.join(data_path, 'annotations', 'image_info_test-dev2017.json') + + def load_train_data(self, score=False): + coco = COCO(self.train_annot_path) + train_data = [] + for aid in coco.anns.keys(): + ann = coco.anns[aid] + imgname = 'train2017/' + coco.imgs[ann['image_id']]['file_name'] + joints = ann['keypoints'] + + if (ann['image_id'] not in coco.imgs) or ann['iscrowd'] or (np.sum(joints[2::3]) == 0) or ( + ann['num_keypoints'] == 0): + continue + + # sanitize bboxes + x, y, w, h = ann['bbox'] + img = coco.loadImgs(ann['image_id'])[0] + width, height = img['width'], img['height'] + 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 ann['area'] > 0 and x2 >= x1 and y2 >= y1: + bbox = [x1, y1, x2 - x1, y2 - y1] + else: + continue + + if score: + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) + else: + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints) + + train_data.append(data) + + return train_data + + def load_val_data_with_annot(self): + coco = COCO(self.val_annot_path) + val_data = [] + for aid in coco.anns.keys(): + ann = coco.anns[aid] + if ann['image_id'] not in coco.imgs: + continue + imgname = 'val2017/' + coco.imgs[ann['image_id']]['file_name'] + bbox = ann['bbox'] + joints = ann['keypoints'] + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) + val_data.append(data) + + return val_data + + def load_annot(self, db_set): + if db_set == 'train': + coco = COCO(self.train_annot_path) + elif db_set == 'val': + coco = COCO(self.val_annot_path) + elif db_set == 'test': + coco = COCO(self.test_annot_path) + else: + print('Unknown db_set') + assert 0 + + return coco + + def load_imgid(self, annot): + return annot.imgs + + def imgid_to_imgname(self, annot, imgid, db_set): + imgs = annot.loadImgs(imgid) + imgname = [db_set + '2017/' + i['file_name'] for i in imgs] + return imgname + + def evaluation(self, result, gt, result_dir, db_set): + result_path = osp.join(result_dir, 'result.json') + with open(result_path, 'w') as f: + json.dump(result, f) # 把result中的东西写到result.json里面 + + result = gt.loadRes(result_path) + cocoEval = COCOeval(gt, result, iouType='keypoints') + + cocoEval.evaluate() + cocoEval.accumulate() + cocoEval.summarize() + + result_path = osp.join(result_dir, 'result.pkl') + with open(result_path, 'wb') as f: + pickle.dump(cocoEval, f, 2) + print("Saved result file to " + result_path) + + def vis_keypoints(self, img, kps, kp_thresh=0.4, alpha=1): + + # Convert from plt 0-1 RGBA colors to 0-255 BGR colors for opencv. + cmap = plt.get_cmap('rainbow') + colors = [cmap(i) for i in np.linspace(0, 1, len(self.kps_lines) + 2)] + colors = [(c[2] * 255, c[1] * 255, c[0] * 255) for c in colors] + + # Perform the drawing on a copy of the image, to allow for blending. + kp_mask = np.copy(img) + + # Draw mid shoulder / mid hip first for better visualization. + mid_shoulder = ( + kps[:2, 5] + + kps[:2, 6]) / 2.0 + sc_mid_shoulder = np.minimum( + kps[2, 5], + kps[2, 6]) + mid_hip = ( + kps[:2, 11] + + kps[:2, 12]) / 2.0 + sc_mid_hip = np.minimum( + kps[2, 11], + kps[2, 12]) + nose_idx = 0 + if sc_mid_shoulder > kp_thresh and kps[2, nose_idx] > kp_thresh: + cv2.line( + kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(kps[:2, nose_idx].astype(np.int32)), + color=colors[len(self.kps_lines)], thickness=2, lineType=cv2.LINE_AA) + if sc_mid_shoulder > kp_thresh and sc_mid_hip > kp_thresh: + cv2.line( + kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(mid_hip.astype(np.int32)), + color=colors[len(self.kps_lines) + 1], thickness=2, lineType=cv2.LINE_AA) + + # Draw the keypoints. + for l in range(len(self.kps_lines)): + i1 = self.kps_lines[l][0] + i2 = self.kps_lines[l][1] + p1 = kps[0, i1].astype(np.int32), kps[1, i1].astype(np.int32) + p2 = kps[0, i2].astype(np.int32), kps[1, i2].astype(np.int32) + if kps[2, i1] > kp_thresh and kps[2, i2] > kp_thresh: + cv2.line( + kp_mask, p1, p2, + color=colors[l], thickness=2, lineType=cv2.LINE_AA) + if kps[2, i1] > kp_thresh: + cv2.circle( + kp_mask, p1, + radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) + if kps[2, i2] > kp_thresh: + cv2.circle( + kp_mask, p2, + radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) + + # Blend the keypoints. + return cv2.addWeighted(img, 1.0 - alpha, kp_mask, alpha, 0) + + +dbcfg = Dataset() -- Gitee From a6359636429e9d67bf1b53d951541f2a050ddb34 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:20:45 +0000 Subject: [PATCH 47/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/data/COCO/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From c5445d233260bfc7d4bb981f3c00e6b987f7b09f Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:20:52 +0000 Subject: [PATCH 48/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/data/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From 5578ff559fa41b228b8ea3dd5f7678378326dd9d Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:21:20 +0000 Subject: [PATCH 49/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/data/COCO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/data/COCO/dataset.py | 197 ------------------ 1 file changed, 197 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py deleted file mode 100644 index 4b78780ca..000000000 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py +++ /dev/null @@ -1,197 +0,0 @@ -#!/usr/bin/python3 -# coding=utf-8 - -from npu_bridge.npu_init import * -import os -import os.path as osp -import numpy as np -import cv2 -import json -import pickle -import matplotlib.pyplot as plt -import tensorflow as tf - -import sys - -current_path = os.path.dirname(os.path.realpath(__file__)) # 对应于COCO -project_root = os.path.dirname(os.path.dirname(current_path)) # 对应于TF-Simple -main_path = os.path.join(project_root, "main", "train.py") -print("main_path:", main_path) - - -cur_dir = os.path.dirname(__file__) -# print("========>>>>>>cur_dir:{}".format(cur_dir)) -sys.path.insert(0, osp.join(cur_dir, 'PythonAPI')) -from pycocotools.coco import COCO -from pycocotools.cocoeval import COCOeval - - -class Dataset(object): - dataset_name = 'COCO' - num_kps = 17 - kps_names = ['nose', 'l_eye', 'r_eye', 'l_ear', 'r_ear', 'l_shoulder', - 'r_shoulder', 'l_elbow', 'r_elbow', 'l_wrist', 'r_wrist', - 'l_hip', 'r_hip', 'l_knee', 'r_knee', 'l_ankle', 'r_ankle'] - kps_symmetry = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (15, 16)] - kps_lines = [(1, 2), (0, 1), (0, 2), (2, 4), (1, 3), (6, 8), (8, 10), (5, 7), (7, 9), (12, 14), (14, 16), (11, 13), - (13, 15), (5, 6), (11, 12)] - - # human_det_path = osp.join('..', 'data', dataset_name, 'dets', 'human_detection.json') # human detection result - # img_path = osp.join('..', 'data', dataset_name, 'images') - # train_annot_path = osp.join('..', 'data', dataset_name, 'annotations', 'person_keypoints_train2017.json') - # train_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_train2017.json') - # val_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_val2017.json') - # test_annot_path = osp.join(cur_dir, 'data', dataset_name, 'annotations', 'image_info_test-dev2017.json') - - # tf_flags = tf.app.flags.FLAGS - data_path = "cache/dataset" - img_path = osp.join(data_path, 'images') - human_det_path = osp.join(data_path, 'dets', 'human_detection.json') - train_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_train2017.json') - val_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_val2017.json') - test_annot_path = osp.join(data_path, 'annotations', 'image_info_test-dev2017.json') - - def load_train_data(self, score=False): - coco = COCO(self.train_annot_path) - train_data = [] - for aid in coco.anns.keys(): - ann = coco.anns[aid] - imgname = 'train2017/' + coco.imgs[ann['image_id']]['file_name'] - joints = ann['keypoints'] - - if (ann['image_id'] not in coco.imgs) or ann['iscrowd'] or (np.sum(joints[2::3]) == 0) or ( - ann['num_keypoints'] == 0): - continue - - # sanitize bboxes - x, y, w, h = ann['bbox'] - img = coco.loadImgs(ann['image_id'])[0] - width, height = img['width'], img['height'] - 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 ann['area'] > 0 and x2 >= x1 and y2 >= y1: - bbox = [x1, y1, x2 - x1, y2 - y1] - else: - continue - - if score: - data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) - else: - data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints) - - train_data.append(data) - - return train_data - - def load_val_data_with_annot(self): - coco = COCO(self.val_annot_path) - val_data = [] - for aid in coco.anns.keys(): - ann = coco.anns[aid] - if ann['image_id'] not in coco.imgs: - continue - imgname = 'val2017/' + coco.imgs[ann['image_id']]['file_name'] - bbox = ann['bbox'] - joints = ann['keypoints'] - data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) - val_data.append(data) - - return val_data - - def load_annot(self, db_set): - if db_set == 'train': - coco = COCO(self.train_annot_path) - elif db_set == 'val': - coco = COCO(self.val_annot_path) - elif db_set == 'test': - coco = COCO(self.test_annot_path) - else: - print('Unknown db_set') - assert 0 - - return coco - - def load_imgid(self, annot): - return annot.imgs - - def imgid_to_imgname(self, annot, imgid, db_set): - imgs = annot.loadImgs(imgid) - imgname = [db_set + '2017/' + i['file_name'] for i in imgs] - return imgname - - def evaluation(self, result, gt, result_dir, db_set): - result_path = osp.join(result_dir, 'result.json') - with open(result_path, 'w') as f: - json.dump(result, f) # 把result中的东西写到result.json里面 - - result = gt.loadRes(result_path) - cocoEval = COCOeval(gt, result, iouType='keypoints') - - cocoEval.evaluate() - cocoEval.accumulate() - cocoEval.summarize() - - result_path = osp.join(result_dir, 'result.pkl') - with open(result_path, 'wb') as f: - pickle.dump(cocoEval, f, 2) - print("Saved result file to " + result_path) - - def vis_keypoints(self, img, kps, kp_thresh=0.4, alpha=1): - - # Convert from plt 0-1 RGBA colors to 0-255 BGR colors for opencv. - cmap = plt.get_cmap('rainbow') - colors = [cmap(i) for i in np.linspace(0, 1, len(self.kps_lines) + 2)] - colors = [(c[2] * 255, c[1] * 255, c[0] * 255) for c in colors] - - # Perform the drawing on a copy of the image, to allow for blending. - kp_mask = np.copy(img) - - # Draw mid shoulder / mid hip first for better visualization. - mid_shoulder = ( - kps[:2, 5] + - kps[:2, 6]) / 2.0 - sc_mid_shoulder = np.minimum( - kps[2, 5], - kps[2, 6]) - mid_hip = ( - kps[:2, 11] + - kps[:2, 12]) / 2.0 - sc_mid_hip = np.minimum( - kps[2, 11], - kps[2, 12]) - nose_idx = 0 - if sc_mid_shoulder > kp_thresh and kps[2, nose_idx] > kp_thresh: - cv2.line( - kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(kps[:2, nose_idx].astype(np.int32)), - color=colors[len(self.kps_lines)], thickness=2, lineType=cv2.LINE_AA) - if sc_mid_shoulder > kp_thresh and sc_mid_hip > kp_thresh: - cv2.line( - kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(mid_hip.astype(np.int32)), - color=colors[len(self.kps_lines) + 1], thickness=2, lineType=cv2.LINE_AA) - - # Draw the keypoints. - for l in range(len(self.kps_lines)): - i1 = self.kps_lines[l][0] - i2 = self.kps_lines[l][1] - p1 = kps[0, i1].astype(np.int32), kps[1, i1].astype(np.int32) - p2 = kps[0, i2].astype(np.int32), kps[1, i2].astype(np.int32) - if kps[2, i1] > kp_thresh and kps[2, i2] > kp_thresh: - cv2.line( - kp_mask, p1, p2, - color=colors[l], thickness=2, lineType=cv2.LINE_AA) - if kps[2, i1] > kp_thresh: - cv2.circle( - kp_mask, p1, - radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) - if kps[2, i2] > kp_thresh: - cv2.circle( - kp_mask, p2, - radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) - - # Blend the keypoints. - return cv2.addWeighted(img, 1.0 - alpha, kp_mask, alpha, 0) - - -dbcfg = Dataset() -- Gitee From 76ba4799abc3a163aafe3d459359da27d5eb0df1 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:21:26 +0000 Subject: [PATCH 50/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From dcd2a69184db049b6d9db672b485a66567e7d8ac Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:21:36 +0000 Subject: [PATCH 51/59] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20COCO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep new file mode 100644 index 000000000..e69de29bb -- Gitee From e0886a0dfec721b0ff37f2b1dd9cc8decea666ca Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:21:48 +0000 Subject: [PATCH 52/59] first commit --- .../src/data/COCO/dataset.py | 197 ++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py new file mode 100644 index 000000000..4b78780ca --- /dev/null +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/dataset.py @@ -0,0 +1,197 @@ +#!/usr/bin/python3 +# coding=utf-8 + +from npu_bridge.npu_init import * +import os +import os.path as osp +import numpy as np +import cv2 +import json +import pickle +import matplotlib.pyplot as plt +import tensorflow as tf + +import sys + +current_path = os.path.dirname(os.path.realpath(__file__)) # 对应于COCO +project_root = os.path.dirname(os.path.dirname(current_path)) # 对应于TF-Simple +main_path = os.path.join(project_root, "main", "train.py") +print("main_path:", main_path) + + +cur_dir = os.path.dirname(__file__) +# print("========>>>>>>cur_dir:{}".format(cur_dir)) +sys.path.insert(0, osp.join(cur_dir, 'PythonAPI')) +from pycocotools.coco import COCO +from pycocotools.cocoeval import COCOeval + + +class Dataset(object): + dataset_name = 'COCO' + num_kps = 17 + kps_names = ['nose', 'l_eye', 'r_eye', 'l_ear', 'r_ear', 'l_shoulder', + 'r_shoulder', 'l_elbow', 'r_elbow', 'l_wrist', 'r_wrist', + 'l_hip', 'r_hip', 'l_knee', 'r_knee', 'l_ankle', 'r_ankle'] + kps_symmetry = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (15, 16)] + kps_lines = [(1, 2), (0, 1), (0, 2), (2, 4), (1, 3), (6, 8), (8, 10), (5, 7), (7, 9), (12, 14), (14, 16), (11, 13), + (13, 15), (5, 6), (11, 12)] + + # human_det_path = osp.join('..', 'data', dataset_name, 'dets', 'human_detection.json') # human detection result + # img_path = osp.join('..', 'data', dataset_name, 'images') + # train_annot_path = osp.join('..', 'data', dataset_name, 'annotations', 'person_keypoints_train2017.json') + # train_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_train2017.json') + # val_annot_path = osp.join(cur_dir, 'annotations', 'person_keypoints_val2017.json') + # test_annot_path = osp.join(cur_dir, 'data', dataset_name, 'annotations', 'image_info_test-dev2017.json') + + # tf_flags = tf.app.flags.FLAGS + data_path = "cache/dataset" + img_path = osp.join(data_path, 'images') + human_det_path = osp.join(data_path, 'dets', 'human_detection.json') + train_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_train2017.json') + val_annot_path = osp.join(data_path, 'annotations', 'person_keypoints_val2017.json') + test_annot_path = osp.join(data_path, 'annotations', 'image_info_test-dev2017.json') + + def load_train_data(self, score=False): + coco = COCO(self.train_annot_path) + train_data = [] + for aid in coco.anns.keys(): + ann = coco.anns[aid] + imgname = 'train2017/' + coco.imgs[ann['image_id']]['file_name'] + joints = ann['keypoints'] + + if (ann['image_id'] not in coco.imgs) or ann['iscrowd'] or (np.sum(joints[2::3]) == 0) or ( + ann['num_keypoints'] == 0): + continue + + # sanitize bboxes + x, y, w, h = ann['bbox'] + img = coco.loadImgs(ann['image_id'])[0] + width, height = img['width'], img['height'] + 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 ann['area'] > 0 and x2 >= x1 and y2 >= y1: + bbox = [x1, y1, x2 - x1, y2 - y1] + else: + continue + + if score: + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) + else: + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints) + + train_data.append(data) + + return train_data + + def load_val_data_with_annot(self): + coco = COCO(self.val_annot_path) + val_data = [] + for aid in coco.anns.keys(): + ann = coco.anns[aid] + if ann['image_id'] not in coco.imgs: + continue + imgname = 'val2017/' + coco.imgs[ann['image_id']]['file_name'] + bbox = ann['bbox'] + joints = ann['keypoints'] + data = dict(image_id=ann['image_id'], imgpath=imgname, bbox=bbox, joints=joints, score=1) + val_data.append(data) + + return val_data + + def load_annot(self, db_set): + if db_set == 'train': + coco = COCO(self.train_annot_path) + elif db_set == 'val': + coco = COCO(self.val_annot_path) + elif db_set == 'test': + coco = COCO(self.test_annot_path) + else: + print('Unknown db_set') + assert 0 + + return coco + + def load_imgid(self, annot): + return annot.imgs + + def imgid_to_imgname(self, annot, imgid, db_set): + imgs = annot.loadImgs(imgid) + imgname = [db_set + '2017/' + i['file_name'] for i in imgs] + return imgname + + def evaluation(self, result, gt, result_dir, db_set): + result_path = osp.join(result_dir, 'result.json') + with open(result_path, 'w') as f: + json.dump(result, f) # 把result中的东西写到result.json里面 + + result = gt.loadRes(result_path) + cocoEval = COCOeval(gt, result, iouType='keypoints') + + cocoEval.evaluate() + cocoEval.accumulate() + cocoEval.summarize() + + result_path = osp.join(result_dir, 'result.pkl') + with open(result_path, 'wb') as f: + pickle.dump(cocoEval, f, 2) + print("Saved result file to " + result_path) + + def vis_keypoints(self, img, kps, kp_thresh=0.4, alpha=1): + + # Convert from plt 0-1 RGBA colors to 0-255 BGR colors for opencv. + cmap = plt.get_cmap('rainbow') + colors = [cmap(i) for i in np.linspace(0, 1, len(self.kps_lines) + 2)] + colors = [(c[2] * 255, c[1] * 255, c[0] * 255) for c in colors] + + # Perform the drawing on a copy of the image, to allow for blending. + kp_mask = np.copy(img) + + # Draw mid shoulder / mid hip first for better visualization. + mid_shoulder = ( + kps[:2, 5] + + kps[:2, 6]) / 2.0 + sc_mid_shoulder = np.minimum( + kps[2, 5], + kps[2, 6]) + mid_hip = ( + kps[:2, 11] + + kps[:2, 12]) / 2.0 + sc_mid_hip = np.minimum( + kps[2, 11], + kps[2, 12]) + nose_idx = 0 + if sc_mid_shoulder > kp_thresh and kps[2, nose_idx] > kp_thresh: + cv2.line( + kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(kps[:2, nose_idx].astype(np.int32)), + color=colors[len(self.kps_lines)], thickness=2, lineType=cv2.LINE_AA) + if sc_mid_shoulder > kp_thresh and sc_mid_hip > kp_thresh: + cv2.line( + kp_mask, tuple(mid_shoulder.astype(np.int32)), tuple(mid_hip.astype(np.int32)), + color=colors[len(self.kps_lines) + 1], thickness=2, lineType=cv2.LINE_AA) + + # Draw the keypoints. + for l in range(len(self.kps_lines)): + i1 = self.kps_lines[l][0] + i2 = self.kps_lines[l][1] + p1 = kps[0, i1].astype(np.int32), kps[1, i1].astype(np.int32) + p2 = kps[0, i2].astype(np.int32), kps[1, i2].astype(np.int32) + if kps[2, i1] > kp_thresh and kps[2, i2] > kp_thresh: + cv2.line( + kp_mask, p1, p2, + color=colors[l], thickness=2, lineType=cv2.LINE_AA) + if kps[2, i1] > kp_thresh: + cv2.circle( + kp_mask, p1, + radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) + if kps[2, i2] > kp_thresh: + cv2.circle( + kp_mask, p2, + radius=3, color=colors[l], thickness=-1, lineType=cv2.LINE_AA) + + # Blend the keypoints. + return cv2.addWeighted(img, 1.0 - alpha, kp_mask, alpha, 0) + + +dbcfg = Dataset() -- Gitee From c2613ecf0a02d264622b1e946ff8ca1ae3db188c Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 06:21:55 +0000 Subject: [PATCH 53/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/data/COCO/.keep?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/data/COCO/.keep deleted file mode 100644 index e69de29bb..000000000 -- Gitee From f4621608af461338689498135b4d7c05ae1b6257 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 07:18:58 +0000 Subject: [PATCH 54/59] update ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md. --- .../SimpleHumanPose_ID0956_for_ACL/README.md | 54 ++++++++++++++++++ .../src/assets/acl_result.png | Bin 0 -> 45320 bytes 2 files changed, 54 insertions(+) create mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/acl_result.png diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md index 0ba36ccdb..83ba2f28c 100644 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md @@ -42,4 +42,58 @@ SimpleHumanPose模型主要针对人体姿态估计和姿态追踪,提出一 | ├── boot_test.py //ModelArts启动测试代码 | ├── pip-requirements.txt //配置文件,用于指定依赖包的包名及版本号 ``` +### ckpt转pb +在main/pb_frozen.py中,将模型和权重转化为pb,可以使用ModelArts启动pb固化代码,我们提供转换好的pb模型文件:[obs链接,提取码:000000](https://e-share.obs-website.cn-north-1.myhuaweicloud.com?token=0xQYRip2sq0KE/psA/59+BRZKLxwglylSGDkKq9CCOl7T4Nsf80zWftId0Zc+TqRVTMTtR1TiXIDRq+a4W6N5HfkghM5sX1GTCI1T1xyYOLeq6YjcV1RRAHr8/mo/0DjOirO77RhAeQ+32iuuaWzbZU0UkcTvtIBWsYFzQgKOaDkaUUhmut8luIAdb97RhTwk9Xb9YwIvNF70BbD4MIemgJlzCgMIgg41X2PrRKyLa840RwBjNeM/3nRimUVLxPI2w1oFj08R7MPETcc9W5cEHlj8RxzJ2cgr/8F/OEBZQNqTq7fHSnWy2OqCxoD0Vj5QBLMztMGxadgGeuARd1G2Pb2+EXBf3N9mSTofqV6RowjgM5ETuhJuW2HCXEdZSJ6qPqtgwfLE4x6G12qkvA+cxG986L9lTGGrcugfTkTyPnLuSmz78pHBAAXBXiylok4cmRz3IM0BFkNk+C4CEKT30kmKceVYM33inGtR4kKvQk60UiGcRnjJVgDdPN0TtCiDE5Wq7MJ+dc10r8XMctCKVxJuHvt4vliJolTG4HqV9Q=) + +pb_frozen.py主要代码如下: + +``` +tf.reset_default_graph() +model = Model() +model.make_network(is_train=False) + +with tf.Session() as sess: + tf.train.write_graph(sess.graph_def, result_dir, 'model.pb') + + freeze_graph.freeze_graph( + input_graph=os.path.join(result_dir, 'model.pb'), + input_saver='', + input_binary=False, + input_checkpoint=ckpt_path, + output_node_names='out/BiasAdd', + restore_op_name='save/restore_all', + filename_tensor_name='save/Const:0', + output_graph=os.path.join(result_dir, 'frozen_model.pb'), + clear_devices=False, + initializer_nodes='' + ) +``` + +### pb转om +使用ATC模型转换工具进行模型转换时可以参考如下指令,我们提供转换好的om模型文件:[obs链接,提取码:000000](https://e-share.obs-website.cn-north-1.myhuaweicloud.com?token=0xQYRip2sq0KE/psA/59+BRZKLxwglylSGDkKq9CCOl7T4Nsf80zWftId0Zc+TqRVTMTtR1TiXIDRq+a4W6N5HfkghM5sX1GTCI1T1xyYOLeq6YjcV1RRAHr8/mo/0DjOirO77RhAeQ+32iuuaWzbZU0UkcTvtIBWsYFzQgKOaDkaUUhmut8luIAdb97RhTwk9Xb9YwIvNF70BbD4MIemgJlzCgMIgg41X2PrRKyLa9sod8v7oOewaSzJFh6oPs0VltNRJ66ZKmZ3VwoUB6PPNZOjRT/vTBpMsioMbQkju8iNFs50rY2vHedwUvENXeC16JcpUGKHlsEjP4cp+2byr7TQmi0Rw6oBNj1AalqCEvvJumjhp+WLj32IT9Vl1Fz6d4aGLEPh2BiWxLO8ZvO3uXwjccj5g3jsr+r5Fwi5hE/gXSfjIiF82n1PDh2wVggyKogS+us60Qks6Gw9fGuAKSOURXV875yiYCFqnVfDcJEUB3sSx1WrcTDOMA+mE6aDAujlInC8aRgjP3XMTwkennHqtT9ZF6WRJ7BLx0cJ18=) + +``` +atc --model=/home/HwHiAiUser/AscendProjects/pb_model/frozen_model.pb --framework=3 --output=/home/HwHiAiUser/AscendProjects/shp/shp_acc --soc_version=Ascend310 --input_shape="Placeholder:1,256,192,3" --log=info --out_nodes="out/BiasAdd:0" --debug_dir=/home/module/out/debug_info +``` +### msame工具 +我们采用msame工具进行离线推理,参考[msame简介](https://gitee.com/ascend/tools/tree/master/msame), 获取msame推理工具及使用方法。 + +获取到msame可执行文件之后,进行推理测试。 + +### 数据集转bin +该过程在原测试代码main/test.py中加入如下代码,直接获取预处理好的图片,并以bin格式存储。我们提供整个测试集的bin文件:[obs链接,提取码:000000](https://e-share.obs-website.cn-north-1.myhuaweicloud.com?token=0xQYRip2sq0KE/psA/59+BRZKLxwglylSGDkKq9CCOl7T4Nsf80zWftId0Zc+TqRVTMTtR1TiXIDRq+a4W6N5HfkghM5sX1GTCI1T1xyYOLeq6YjcV1RRAHr8/mo/0DjOirO77RhAeQ+32iuuaWzbZU0UkcTvtIBWsYFzQgKOaDkaUUhmut8luIAdb97RhTwk9Xb9YwIvNF70BbD4MIemgJlzCgMIgg41X2PrRKyLa/P9zJ/LtBBd0k4otGQ1A8sc0OB//R4+u726ynIZI4FQtdyjW7D0wchg5zlGb3lgauEHw11Ja+jtGbC5td9ny18iMwEjCwJHo5BjeYYmXx1NlwddzjvU3b9nHTgM/CWl5OaxwP1GNy25DrCUr5nzjk+4XHG74gowNJ1VvqGk+g9Wj9oQcDC0uVBs/ROriyGpgG+qxIx2kN09VVjtvrXRfFgucCQjbOSeQHYz10ODie8wUFqOPZsWVp2idQtggqxTe9vkXdM0ivnWpudFyoOpDnTAuWCMtrq0hoGeav3pv45/MiTuoFCA9hPk5KSfh2yg48QC+hL4Po3c/hKih3qs+9yI9gj5mrLrqmHZr6MpuCzfvXRkxt3U6UOuaDAx13TTCBJMa78e86bl5tquAUeQ5NUQfOkQB7+eSf3nO8T0YBBX4ZgNAG8NPhcVwKm79vlbkf3O6iY2Ghr/Q/VXL7Mj52gkbcyHCUeugko1AnEtyAhflzbBYFHOR0dpCwA2PABxGmYhYq4g4bsCa/2xUsOon/9WG8Y+iQupL+bL1TH8lWyRQ==) +``` +image = np.array(imgs) +bin_path = osp.join(cfg.bins_dir, "{}.bin".format(count)) +image.tofile(bin_path) +count += 1 +``` +### 推理测试 +使用msame推理工具,参考如下命令,发起推理测试: + +``` +./msame --model "/home/HwHiAiUser/AscendProjects/shp/shp_acc.om" --input "/home/HwHiAiUser/AscendProjects/shp/data" --output "/home/HwHiAiUser/AscendProjects/shp/out/" --outfmt TXT +``` +推理结果如下图所示: +![输入图片说明](src/assets/acl_result.png) \ No newline at end of file diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/acl_result.png b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/acl_result.png new file mode 100644 index 0000000000000000000000000000000000000000..0bbda1a29786ff62806ada2d041e7638516cd3b9 GIT binary patch literal 45320 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

E9od(;Gq1SLt6P_|gy#dtnlnDy%DH>| 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 literal 0 HcmV?d00001 -- Gitee From 84ce517681f01f5bdbcadd70aa672a0b23870f22 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 07:19:30 +0000 Subject: [PATCH 55/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/assets/1.jpg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/assets/1.jpg | Bin 117209 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/1.jpg diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/1.jpg b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/1.jpg deleted file mode 100644 index 97087f6547db2111f5a55a6fabebe2752a5c58bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117209 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%0DtrIO>!O`{oN0Vlt?{SVYvK;9Oxv38SQIlv(h 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

~bCZmne?q<~|RRN$XRQV77oVe;3hf5AJx3~8UV z?!V%{6?n?pbK$=VHI#PxWV0W%+?i0SH1eQb$@{JBR~dO!D>4J0ZTRo|3Taxj(QBUs z>@BQZ?ibob^PeUE0J_oc&ePNtBri;3ocsBojh-6gvsJ^{!*PvhUUI1vsYd#!N?g}X z+UiMitv%%QU$bzpgPthR$)6T*<)tbWIb#}fy=Kx^lwr$f6rG$~=8|vSly!eG{2lm< z}NbEu>OQWG0Np)4?O7c^3$*OmnK1jj+lx3fI*)+V{g` z@PvOF{tI{`RPZl@@9qB0{{RU7q_AJw>-Uz)35Jy@+329L;d(>Y$zr ze7Pfx0raoSIH!YX;4w5X{2_{lGI+^L*wc)oDO2TFl|@l$$rWq1;NQBhJ2U!w!_F(i z@nsBFZ{j8nre8xXgg&=gP?TxnBPlgc4(Q9?b!thzMHtjjUeak(Z64k5>&G4?_Tkv$+qI)#^eFXP^uW@1Ifm5(*quh`z`p(S(o;Z@RjzxXa4{R#nWnL zD{l|#h>351Gshr~HlF0LP$nrUb}Xx~w$@+)=*YY<k z``?Z=Jt*mniEE9~kgScgm)pk#bk05aJu_ZC@M0ZKD6c$u;x8Sii8XH%+^zNIwP%&J zlp+L;EfbQKh@gnK63nE?#I%fSr1-<}PfYk}@Y7!St*Oo;wD9JSbE(dSRDxlJm;et1 zmH>0qn(3j3h8mKm1!W&k$!M>=mfLE6GsHQCOw&25T2i}i+P41rN%K8#c}rKjw#Uui z0DLIF7XJWlACJB%k`!09jtwJDxQqb|QierU0Cyi`LV4gbWOH9n{6F}KZ+Gz8%KKBY z7Z+ByBF|CNnSNs=WNZZI0B~9I56ctxBR>d#!8AW?9|e3c(e+y&jXFlCw>~h}MyGM& z`&KuLaXYE~)Uc*rHUzU511x4AE;h0HXTaYV{2i-&Sn&;?hMrr!GgiG@g10tr62+(# zSD9lB6p@J#o_K46k$^Mj#y{E7qh9uP9HTzgoSdNVy zg{gIC%gY$jn_W3;`@8K~>Uv*^ujT&$gqKBYJx1m$tF20Bx{e{F3fYF`pRWs4Pryi4K|-znqdhRyNE`zpuqt|s8geeo8{PqTvHy_SVF$cbZV z1dTM&#Ec4#0a)ZYJad3+*MDid7P$C{`!mBet0_%>;Fo#I6lKyKwrnHjCuu&TVeCm6 z<`}79>q@=;8d#_Q0G726oX+UO6U5v-NiAhvU)9dm`;z<5ls-S{vG}9@3R$g5d1luz zX%SmXEFv&gRW@-)<;qI7BgCvp+maNbm1kF9P=*+PvtqK2LhBp|nPnh=6etHhH~@Nk zp0(yT9vW|tAMjN_6?hxKaSdBm)4tPpab;_F8I}`kZ4$E-4V|hTI}?&}F^c+T)Am^S z?WZ9U{3O*K8PF!!fo$&JfFI?~2s?qm{^{nv+P!!~gt8ngWqwQ+9`@+nIO)FnKfLdB zs!xdXTGEZVu{Evcx!%8$`5tSgXo{DnHW*?#0OvnXT9;AMuXG!Oc?Tr%%O8_I{@smx zzlT3#FO53BpEjo21+JL!7Yl8FIF4!d;EX8T0AtXS2LiM8uh{IbsaK!BDiofjk!4>dk@Rrx~~oVK^K~u ztk_)OjCys=dWMVt00iN&H)|(}{wPTB?_(?)c9s>GZNLHDn;((uT?U)`1NcJ2P`JB~ z$GV8OeEpIIwU2Z|i~`5+_sPJ`O_M6@;?Ieoj?^%5^K=|@_4KLyH{uIhmT6g+9N|gH zBiH#?q3R#8pNAxbN2mDfR)$VUdx)ZuNykE!yl_S%K%fCcpQ$KmT+pJ0u!MnT9t_pbWS;0MDSO-K7i z%S)aUo?~0*D979$oqa`g+HZz*T`mQ;)3m5C1`9XL#QKtXG$^)DGG~qp1Rw<+54J@% z>7&!_%$`^$oF?4oHSD*38qx2Ek$a@Ty zsUU3p-`6#HB)c~^8?wv3HfAc^@wgr{_;Fjl6Zl)E{6y1a@W+TeEZU{Ep={Alr`*`I zk=??>=2li1V12%$n*9Zz!oDB4oh6?_v6Z4th-9-yD7}Uvg6|VTV_I3MMo5bE4MK>D1f)Sf9duWW?r?Xt; zmp?8(ZNGlL&iHex=|3IxEeFSc13XP<;!g;8jun?o@n)QNTkPAH5-2;Pkx$Ceuneql zMSUM_ruk}OdH0YClJVt8Ac6?!K?H&i1Rir=418k!jQ%};!94yYYX1PW@B9-Z!!4`$ zQ&qTY&x*gZk~<})sH5hR`$QazYqbQifkqnyAYgo|%FY{XQj(UBbLd+yf}T0DmgZek zT+^esfp;yzcEgVBMm|sg?rY~C+UMi`v7<^n2k97;08W-$I`%h}# z6N|=Cd@{S18>?|~2%7dEw9KcF%@eR-SaZ+Jb6#uX-vfB-;hRej#2*W4x)TI0i>T?c z#tP#lx9uuNUWd}ZU=N!vVP-(Y=aYj?n@%%8@JkxXjD!_(7#xn6{AY;_6-~({)JUwzfxaE^RW!f{o6&59XEN=W?OLbRR>1!Lt4w zOAm;j8Fd)o20K3j*w{}$?zTxX&vCo`Q@F@Pj5bbAGtP2;V~9P>4N7`lsIOgDpY?O^ zc#8{GpN3T?+mvBzHuR6aqS9Qtb6zdlO*XZ&vVLLv34X?Uhr(?y{u)QdHjy70Yx2!; zqg&mh5u;hm#ga}B7Y>JZ;xihufriPiq@mPivsE5e*Br4|+%xqfHRaFyTIibZ##>K= zy0($2S!;4e!tN;TqFY#HRV>O0lXCzE1SuFIyZgOUPh?HEM<8X%?tQQ;`wJz(<@rtm zI9w`Lj*q*QwQ}?Py$|GU{;qMF<}VYDx^q{GdnmV}kCOaeuU2>${1gWF$1;38@n?xN z=Y-lrq1i$r7SYJ$JnSZvZUmuUkZv6O#CNaHZyjnETK<8h$^=l2AWI5Fs=?dNo#ri^ zZ3?VN!65wnXB>XB{AKtft^8T|UpsR4&N=!w4=s1 z2I9(eWN6w8SmWBrz-?uDWdt9XFHg7nKOX-8;F@|TgCMZIwYm6N z;tRhC&jsw_R*nEg?V7BcS9+`$UQo)b4cK(^Vr-qTqY(|swSLtY3`cQue=$q zBDjt{#ZiIhZgM@%K(I*^oD&dGMphKL_;vL&850G$pdUTeU2r;bo3hSdl}cuMD{abAm8I z0E|}e#^3lVzr!EfNA`Dz;D^D#0cz>u?-{%ndX|f*My>WCv`p;;$V_(xx_M}FkMjpH zuR-`?AI4J6;Yqa(64WP#G(1ZdmJv#MK5WaGNWt9OKrNCt3^92P zUL?ctwCQI!WkPi;)t4`nrO$g^yK^}uzL8G)tN0mS9}gPyl|Jp?ePr8xI(`2DneiOX zwwL~52IPT|*~c9L{3_knnQwV*9l{_Bw`j=gUuRr@!7#oVN3X}ITln8qT`gh;ds&eh zXOo<=xBws^^uaaezY~AppPv?dH?2GTF^P4(DrsX&bhw=(xD3Z`3h<;ZdW>*-Q|67& zca_-lpV{|LpZ*dlC6XBYlLj*_kS0|mqhzollajd34j2%64#xig_HOYvz@LDAE%49m zF>Pt0_={TAmsHYiH7lrvt)!*l62%#v9Ykd#eW@nkH|zuexaWKy;M<=Jc%^JFJhjxc z>zQGmXq-#7P~{y})R4-h0`Zk38ti{*{{Y(aL;aDy7uajpnrrJ`G1jqV;I9io5ff^< zn{8N7s*jQ-k>f5;Y$*AiYr^prVXNUXY!!K1n-Li~Ez}_yRCascNc`>OefNh`&9L~4 zbxb6A?@r#$>j}xqF^@cNW|zHt=$AIBHhkUTe-!+4z12KJtNzlSDYw>qQgwUHEvL}u zShVY5Xv=IC*-|xEg=UK6GJph=E4J)%-4BN?oIx(BV(^!OK;k!LXCUr5R3MiM0W5Ka z7$<@&*neUl*v~-tz3~44P9G8VKM-8m=vED;Cx|Sgi7j=FMjMI$0JP^0!+Ymad%~v$ zSwLXi;Cfz{{{RHYn@^hH#qof`vfUK7X!Om^_F@8Q=N z*7tXJ>vz{v<#U>}@j0bxl+;vtow*W>Y_wdl=&Y5OL*z|y=UZvK%N1y)x{Y3SxNt)( zZp#o&_$l+2q47p`)KjT?t_#>}FZ*dY#+J4V2J8i5G$TC^?0NE}F%%tH*%&MVJ z+wgzEGyF}cgQx3%5p=6tWVw<^?qJim%^)FFK_yh6!je?GE=V9L-I~9(@9a zkvx5_m~W-FOUwOMB)7G?jzcOwrEtp&l`6$q!V%_Ww(VsF3S$#k@cfgl(^%P<#j5R= zJ(%*O->{)Q5R5m=*DH=W$Jzcf{epfOc<;dW^LRs1z0q&(-Yr3z;`VEcQ!IgAR`QEw zON6o^T0<+AOKNg-uos;CJqmMTdfJ7kQk zO|?EY@ZX8_>tt&?*_t?x&~n6in@&L?csM+a{uO&tztHdCGuYvRk^ut;IL};l{cvmO zyZ-?AB}?3`v)X)L{q7jvH2N_LbBqKFChob(V~&^=vvdCd1i0`ld6!K1udYEB)gmUa zhC&z)NhcW@&N$#4b60qUosW)h;=HpEUtQR;MKU*#?Gq}@6^L@D7;U8B<2!Hx!K*TA zHkR66QdE($K_R#xdV6E}iu*4>{{Vt!{5Q1HWrM^&61A;D=1AM@?G!P^9lVXv!hFQz zsa$}^k_iJGhLisQ1gF(!l2NYwW{5|EVOt#>md@kXd*BVYJPxFegCtW-9Bz-1A+~)> zP*P(+hE8$`EBF9UVO?&S;U%}x4AT`->5vEv#PP>oI47TK`u9iw0D@xpI>H~bYCjZp zIg%*K+6Z*mB6MbL#hr$C4o(5-(>MSRN6|lHKY@Bjf|J3zuY=*gP*tbYZk>hH&z@V% zTooRHZ~)?yo!BIPZr;y&x58K*qmnsyp&uwx4pffA7zUQs!rtl88c=qhobKv-pX*T8h^C8%tJ1o-x58-axxYsrJu${W~AC_rQtX zGT#S$I9fK}5gJlt5_;9^AA}zYbcr5aJK>&#Ze^8alWvn3UFxAj091fL0C9}>q^82i z{KxRckBW6mvt_4vcK-3$F5zusB!o9n_d(|e--BMQZTlwv(aYht@fZ9m`_+V^x7qx} z`%9_lL|eCgLBaah=pC#U+IpC*?4yKZfo~edq;%jY8K)%7k_H&Y21inV8cp0IWY2>% zuh}d1gw(W1wO06VGBw4*qFA(uvnR{<$}#y56~{{UkD0FU+>%X$7AwYBo6 zN4c8gSWz62DGno7jhVh;3bDZ2F@wn!_RNuUh`kw~%E20K!`y)#5b!IV33Tc^v!K zqnY-xInO-vT=&GUir)`@4R}iD;wQxK7TRdKO}5l~yO+t5L-%5h7v`2m{utC2Z())e zT8i!He9ilDc#pw92Xuc5{51HL{gJKPd`9s-wugJ6Uqj|YaiqM_rSy{{@#Tb;IDtGD znMnJDkB59&{{RF5{f_)qS7gm~fqh;cBYlapv85x{hf+dZih2N?53bdSwt#?9unRXH_H zX%@9k&sNj#t)BL=>VLC0?Dz1u{s{^2N8+dLoBL1vS=D@Fq-$0hMuDZlb*9BE<4&~# z*51`^{zaLFKmZT~Fb)RNPs;xQwdaSmogc(DU$tkzFN<^Qeg*Nui8P&WN7Q6^t)|>b zw^PGI86nEV!3=Deaj{XhQz1)%uH`#t#6{t@qj+CRmMh;{z}gq|vcQPn&Gx;4zU z-XVr-H;t{t$c7}AIOZfYj1@~do>&q2{{Z_we$pv*`y}fB00X=o@b^vAG!1vfa_ZB= zJ;c`+8g<6#OIx9Bst|}EV8IoaEr54qe6NQ2ClO-!qMmOIGv%(_XHK*&8R4HLuOr9bw{IHH?KUZrZzZ)l0lJ(!{?7=Qh)tb`^ID7-vDDV zKU~9Mo)W)Gm}$y{*ZvD?FXt9}nMaPEBw+BrP{m@FGY;)~Sg1!42W_wI6PBGhWUPH# z@ZUI!dc@ZWD8lHQUlq<>Zr!N_XaI zJ0`& zAF_ADMuS?q)5fdf-CE1%5vvt8mJDtjBL-4ul~;2Gdr-h5<-XYe0D>?4PSw6D{{X=^ zz8`;UNV45{fBQqjDETKaSzR=C+>&xdyTGFzkay<455M59pA@`9`&fS8pA|e^ zruYlOemK9;ygz?`E8W8dyiT^_8%tJEP?{{Y~a-v%!=pW2Jz74Dhg&3eng z+PB0_B3)<2o+H4JVFRAZ!hZPw}Zepcz&%R9kCGRx}VsyjxcTEA6wy7Ny} z=8^M1?78tDNBHyc)5c#O^bZfg1*NycUkmA$_Rz+mAi0!XUtPesPzK3JT=!KR0C}(R z=is-4J|=uk@HfTZ6Q$|Zd<}i5U1(z7>tr5n-M^6`l`-?-3ERlQC#`%_{{RI1{jL5m z{>xvqr|lK{4&CVqt={QAAT#(YS{5wUmImJN*`)VugcpIVq=IFMoEc`ek_A7#V!u28 z0KrsmJ~sZ%zZw1ltr%xxRi1v7i!b#aSu9v-jsZA*@dU@GCT&oR<%lN-3%rhCrqr;~uLN~Oe z;qk@kYd3VHt!4N90q{rmF_XaG@NnOTelz$-Pt^6T16Q%t{6nv5AsTqJEnoXCc)ran zu>vjg6ss(8%oI48c9+}7>!G%Zl@Rhl1ar`jTvz31{2M#_Hom{%&m4cjM77@)c={{< z02*sonhZK#x2}teeNH&MiEb|LWMmUwyjM){!tkg*^ZPIxWOefY1n z;jF&CSCi7h)}K6}lzFXd*<1bxqCSf~#!|=Tm2ni~$fVo0_Pe; z1ff-6K_d(LbmoVLIdo{p9RVPJIvHI?$q)q`?hZ|R$B|%>M$v{)#Eu9b&lL>NJCWtO zrU)nH1pfeqN>Q?K%IkrQHzV+*mLf2Sg!lW{Kb0}7rZvI4CvFr5DU!^Q;jq?f&^E|7?*R7)`TNjBO~T=Nk8*yLjIo8s znhyhlhx$+n4rFM-EiOO1f!3N1TXdV%k8n7}4IoewSW$;T>Uj61B}oh+U@?G0a0juc zzQM5MnM(B|p63*YG5n1YKR5TY{(h9!c-(yOw?lx#nnGd1sDz+AwnrznX#n?Jj4Av( z8gi?!R#M|>$SWo}{{T2N!3h5VR)dUZErNf~)}jJ4CKLhyJBkyKev|^#`78FZ{eZqA z=${v-{knhPoZcX_@OQ>UQhZV2tD&<(_=#=~=e56x5UFz5`ECX>*eq4B_2^%*C+*+x z)Aq~KHBSynp=v%0_?O`)FnmGyU*ZGh>RKG?cC&!M8SRTp+m$Hne@4qU9Rpjl~@#XIHNA4%YzxXLH>@Dzr#RtItDE*_fyRB$Q zQf)88cJu1;#KZVs>}evSf3nTEdRE1+?W6EY^Fx!w_O_lgZ8|7C`7c|*m#V&AGq@`# zX29nPtbMESd-g8t=!HRaOJ@c1}Q=Jg#a zi{YmjIXBt!^K!M)`faU`)hFQg8#?;DxKTW29!uZE&b%qYGEH+u()LcQB$l>(?#(+r zZS#Np7k9-P2gc9%DMjzcKiTH)FB529DDY;93SRjO94~bRt6ENyCD2hDA%-SzHAd2* zjyN^-Py8Fh@RIZ4x59soo;}pOZKZ0LH=0$fGDo7?DqGt;aNSD8N&@-igoq353;Vy6 zxcRH|-}a#Ro8wQ7`aZMb-yG}n>blgrfW5iDxe8>J*|tc;BB&V{-~c$U)o=J9_w5P$ z6L@R(1h?>RhvI(^_;NVL@@jtiT+my!0|w)2~WXneF?yMpc6fJQ6kb4>3E zSBE8y`n;;o+D1BQ%V{ZdG?cV)_foq_%Xe*mH1Vf^^KKQytcMGTlc8D=np(>H-Y(pU z^3ER;gj|)c6?-0O`#$^<_!+7EeYx>B#T^FT@?CZZiqlfmJe7Su>mMUUGRM9Wz!VRY z)CR~k)&9^Qv%inN0^P2qd0{R80ETZ5`WC$uI1n+%`aRHIA(#RP=&T4UkGo!L@f+fA zhwuI(PIXjOd=4p2F_K%( zl~^i@H6sh?qb_w7&X()>gNXPWiMU@X_Sxnc&Xf|hdQD4~_OxdQ%OtO+wn|S%&MM*V z)=jA_gE$;B1Nv4)*TIhsc+bY^t6ZIC+gQB4f-6~UyhD9xuKU$cksQjr9B1V@?^?bq zm%#od*2lxmBgb0LguGdMY|`oSY5F`j+FZj7LdgzNOGnC(9wss2hGSi%w7;{L?9=fN z#2*v%9UJzS_~E8apeCzs(_O)$8KzPtRs~$NV&9-$`((f*?aw3ZIExXUV5e4&BP+zG zNpmL}aFi;m-8yo-l%pnQM_H-Nt}QD9WVP1-TWl@t>I7F{{X@FQKyG~Bx-Zo_@2?DDz-i)OIQroJAm7^ z?g$n_KKGq(aNLPAP5%IbNPJ-Nx9nU000fu#wfk0U+LPVsmipYU;H?Kz+}5V`V~X53 z+C%J?;z-feSPVdMf=RDR{{VxxemZ!5YoCIjvaX8)&#YRa_VoV%g52nTw2#I=7QODV;mtQx@phunq9kgz)}Ldwfftam2`=D3fMlwkbCQ3f z7_H=qRxX=B8DMda#=jB2;L%@%Qfhw@el-5j8qJEjSonWQ@b!h{v1QD+cQRf~5x~Ly z-JBbSayPF7cR#oYu7fLbNK?QZk@WVj(K5Oeu=svTaZ!r0NobNuB$DWtL*p^EYF4i0 zH+J=H?%V1yV+=F)gakK0I281VD{cxD;1X51Iqoyol*#jz^ANYX<06sMZZ|{^uGYXm zhf4I0HFNTx_AC9Sd{6si{B^MSP4Kt&U+@>h*VIGF<9`?UJt3Cj-%N}Tv^)*=Xp|NO zV^(u0-71i*YxO$QPd4_j*~M`%NFa_B84STyRa6oH1nmPP06m9F_=o-oHSkly-Vgnl zbzh7Kx}>`AiFNCZI_~oJ5e>1jvvp{a*%enH$s?I0U|h(XGqxZr?ro&9uqQr0HEaB!R`E_ZhI0p?@MR~&a^oYfB!>-Sy~@V=|!t6MjkZ6iy% zzlIb5mv|s~RY$2TfPOW7k+*@8GoCinVU9UvNNytYA!Z3G6M)L!D=GFMkbbq|Org<$I?1apCz#hb)->?i+?t=H59u%cM|&9(ofa956;72I$}LPCp;~ z75%vU8K-E`roZ4;_=6bJ{6lLH&9oNtyvYUBV>=kf69teGl64Fl+$cikjcU zWYfPgJ;TAtj|S-Eg_1L)S}=a0fq@QlfyX^?GoFK`X~I#HZMzVmuydXV^~d!Ujqv_k zn0_93eN3=QM~8Iq?F6CYbM{C^1IQf9j9=vv;A-7Nfa>YhC zTz2;0eJOy}whT!J9=I4F`evVQ(JLyGwTRjS6OqU3O0tM!+59_j7oZmgCo+->pd34vm&%CUWIfgZ_A^pZxh4zcaSui-;Ew6xVf}U?O1HB@KoF}$ui6GM!bb)AOhp%Dtu%8 zq_kfGc$Pnee+@h}apOOTSN7&xKM85G1Y0<$@|ThZiuXTuabY@r8;J- z@O$8#9x3?8`5Go`(NQd z!XJiT1^hQQli(d9OLKj2Z#8X7?qfCXt902db9X!Z^U6OSX$l(XRC? z$S-vL9ip?lw|K3i-wf=EZnGqEZgt$D(UhFv4)69f_!~d$74ZAwckPMs+ed)vIvu0w zz7tsG-wpCU)>*CO1LjMIcoACxfDRY~kz9}MCEy#s+9u=Rg@?lfu3lPrn@)WrM!D3{ znGzVIvQ}p?+QkGjM(J`TjwYB9ZYB;EK#TO}?Jw~E0Kgh&?E0UxMvLHU{{Rs9N5fh~ zcDjd!{6C~j`lbEi7-Y2;(j&yE!T$hxBjkg;mMRs&^tiVl?eg3Q4AYdYiJawKUh`C8 zSKqv}v#BM>uC=>Ot2_RGUj;nNJE;gIdqt+SijN}MYo@7a`fTogH~9O-8uyLbkxBxB7+4oNt;*3$e$cC#P!H{g3|uVV~Mp_Kf(?H-*1u-vGX^q@6hjh;MGL z1--VBBCr=g#PX5-np8@^}cp~G&^55(CcIl?- zcddFnJ!1@|ZX~;$XU$7>1iNI1ZK$Q0*FU>|0R9I2GX0i*5$Rt9eh}y;%SqBBUGvC` z=U?11k2dn*$KSY+g3QN-$VI{`sQXSY;v5b|g~L+AL3?zRpte-it*VQ&Qdf^Ec53eW zEBib>lGet~ue5);_+FnA^19O7-q*dCdwvN1)E@-CD}KrzI=T2k@q59yI!>`~63&1y zlHT?PEE4A4RQYFxut0U>GP1g>t0?kzEpsQ&JaenYj918z09kU%M2ZGip&%7wourOW z?%(_sNA_s&FYSH%HcjEnXNpf7=-+9*_<45?yUJei5n6i*Bt;@P?ooWbtUwbiE;&PA zhdM5o93e%`lYnqR+EMn9PeaB|Msh!g1HF5k9mJ60Y!j5#s?%vrEw$Q9t(~5i-8I>s zc72q8Vd6c_VK0Tf)wfTj)}1<@x&HtJ`0)*|!|&TC;opd_btSR4J|RmtfUc-#8>M-?G5`ld=&kyJ|1a*6?NYR z+TCl~-+{~;Cciwhd768?CRk*Q2M8HukR8QIBO^Gk%zQ?n{g>iqRgQC%A&Q|}4<{9W z;ked?*EDZ?%dbrl^!y!(c&vvNLy<~UrwWStd`ZFEM{SnNsqcTV&%{57R~{kPz8CyT z@GYj9Z>HYb>OLC1u-97XU%<__;Uq_f2ZB^&g|-!BWt5e6+Q5Dod|~iEhWt_Ee--Kf z01|XB55=hIzZCVK5WbyzY_i`jsXUX!Z0@2ZOm?dvONWRkGKl&xMcwr;>|^m~_SF4{ zzA^Y$UHH%7PadbkX)l(~#I|~_l_k}^g|y+LX<(I|zRu|Gt%hVq!Bz(0Y#$Np9}&JTe#f5?t@TU2O5EIdqr?6@vKMikt7i_9pIJu3Wjfm z@f#zS2N0>!sTUfG>QHy+;_bbqebx4QJ&&o#b04oza+D<&otl!f@8zdwIJUj54 z{t3;Xe%Jp1ww;EjrRthafTP5Aap~&?&a0|G?+ZZ$Q^5@#*lzxOB6(*1k7IZKz(rBTp%2ipm9Ogn&-QC6USkn0CV&&-g*& zgw=dd{{RXpQ!2%E$=z7M_9w99*o`*`BDOX{D1!df@%KBp9Q`=d_V9{>=p4&A07Ns_=l*ZJ{I_Ur1*y7_SQW$%L(-> z`5M^Er`p7kw1mqmGb~b+1rvDvi2aKH0A+m}_D%RNr~E#YDlT?_6g)0hI<4ZckhUUoeDkQaj9#wRc6}ohnpd-X9v8Ez zP7ZXVY0FM&Zk6us_gh2OJ|B1!!T$gYJQ-o&9|P!?+FqNdqX?}mVF?(K-KClEGm`SW zj>PiJ#GbXWB!Pzb%MuQ98~KW;E(0(LBCbanC;3!Ob3Ai-a;lYJLNs85k<^jXr)v9} zaE&@@5!n=z>S&i%Ic99*2MLVQdFvW(lWPITLJlgdcPWjTZ%pI@X%3))i3RsB2O|UV zs|z+-^PrAU%&Ls%00Dx1u}*i4lK31RGBJVaRL$IcGk^f+aqNAKDY)puMQ`qs2lJyr z+fr4ME5#BBLvlgfFjS1>^Yoy`nQ0#YlaSfu8i{UILGreqGDZnM&W}DKeqEnU{Qgu0 ziK3oE88Q=)afbBvBBVHH0H_)J+~bO_(gsbYGswmRaZZkPDt7`l{U>X@En)!1;1P$>Nc-Au+6q$^iry=zf$8oW~kS0RUv> zSR4#{QUy?nPrB;v|4%V5L!VGI$)3Uv7WF%APOQ{8#?~1tQWcZ{=pN z(7qUHpV_f7Bo8{~@!tc~xCH+Ix+~@{*cU_bABz6~Yu^TVZ$+}UoIa>0)Z@IhNuoA! zgDm@%hX-o>tT0vfkU_1dgvG`)h91tVR*m-NYfJfEtNhIK4A%{p<&wnW9jQ@_rz>_z z%1_qI@Jpfkv*R5f_F?fK!0i*^4~ev^JvTttbjZ(#^eF6%S5~SKU1o|EQt-Sx)tXJX zMk8_gx%u0~zwk?shn_w06p{Qf{iUt*AXd4vy|RwxbW!|xidggO%7Mw|wf_L%r9TI} zZR14IJ~{j(@e|tXUk^I z?~5>8+vwWWw~OP`_4rcdLtC=SvD^kbzttV*41Qg$jP|D~Ms$r|j zH6t|%MK5W|DQ=|Oc6UuVD?KlD`+tRAIdP_Ah|8(w7z$J&jl*4gE@dTB6sJ<0T9-6b zWff$(ZwA`d)_tGtbN>JYy3sxw{04!(1lo9?#vUV{;o{b2ky8Q#6SnB>;~W7XPIAYZ z__yFC?~DHcW$%ibR-f@pNVwAMyk%t8(+m4|g{>q>Fs4;-3NUek4?9~m`VaeP{@qr8 z3bi!wN9^74uvX2yn=YHC&SY0I-ZplqN7f{f&v@MAZ?JxD3p1bE%$ctx#FKVkntvZyIS^G-%Zk;sLq~)zRs%=H6U2Dx{t3@3S9Y*FN z?3{hlPeIRbP=BpUIJEG*ZK~dDt75AmkQI<2&u|Z3d-~UV;m_Ki{t4yrf-5;MuQg8t zKCL@LrCjQk?P(3^9B+pu)W?zla;l{9oYemS55&g0cqpgSSPpfZ-wrywJW$^bWD;f@OXX4KPbjQ_Qw_Fm*alh`2<^D{nf=6A$NurlBu}~ve5Cug!=0bDENCP$Kr^7!Pz7}cFY0D-4hp%7w zHvMfiZ7>NE+GVox=SGzdBg|6GgU>0sN6V4@XNvLR@kDD^c)C>O?4#`I(v)QH%+&47 zxuq>snvcT{oY!aYzlq)iWjGocem@(RO0uU`P@LwbtxuLSr*%$BDje=nN}|?nt)$WO z4F3Qcbno~o_xu*(`YlsJxzv0QbK@kR!UAO;Zj+;E@Tj+8mHz-ycMKVpB6gE@jvIOc z-fjN?1<>)Ijs7rx-kR307l!X{{5RpNNOT<+RI`Dnw2`3&t`~e;lt{M{N{pn28vrUe z&(J^cN3YqJU;T--?~b3fAI9A={GW&Z5Nkai{RnvPVljQHNg-p@l!Dy=BOtj`UmkwJ zUk!dKe%XJwmW$w>7sT44Pvfr?tllHLu)lbkbe`a|Jib$M3Ea#-x~@1=&-3byTHJ4n zt64wxNGf)J^YU++Uppwr=65ANV(u z_F>ll0A?@vCRc_od|9C#KVSHdsoeO(Q?zK=WrhjWAhJnS`baHp<8rtd^YM-ieZ%Is ze5Tar19D?EUq#Y1j}GW|J{r-j5(^DJ&MQqi0mjRCkz4b)fZ zv?=>4YCV5b;VViqsN}Z4;3~<27F$q5bRgt@1NB(}a2wlV$ zE$&#Hn)IkIE$6pOi*W3+a)FSB2RI;u$RLA|YKMljy)Q)Y^`C~kKVTBqO|**M+67`5 zL=BB3us&=8a&eKIbj?%oHQu9b;ay@)FIBa)yj?2otZ!}*h^=K7@8!t&AeC3c zw;n(&I@lbrTCCsX`*QNZG?K#knVXvnd?a=Bd(@o7=vN=2T+kD<27e z!5e>V{{Y%g<9El6XZCRYp=~17uXJr1O-la&Qq{DF)3seX>L!9S6wxektCnd=CP>ym zLFJT;dl&2l{{RIZ_`CZ5g2Zvy_@elqcYf^-dHdZXY87lNLkEoSb$wr5P>$9Ex8zE9Czc~=il|Op8o*gt1%1T_$Hsm z_@aPI=lnXngvM>-lW=KaLIOyPx#Z!PZBvF~p?5FPEH`b;gBie10s7?fd-_+;zwlJ; zRrF8zC$GirWgd8^wD6NnY;Ep5oJzNL#wRjlZ3`yGY@8KB2q2Jisqi#u4~-t>;Ru@F z!J0L#+F+zV zvJF1io0nBqmAsV85C8)wEr0+SAOJY4K|wsqfQ~~Gf_nC+4}}u$fATpeR`O}vSOBOgB9-JId4O>B|CJM?)UZF@} zKObXDZmccR3zEh_gDm*T`kz`Nl=++{1^@(%15A?G7u>Tr>5#3oAFTr>F{-dhlo8ZE zGBZxtV;h8uLFfr1H56N7mnumZ!N~nFOCIDS5)!=UDgplh0YI*raY!nR1ey%gGJg{{Sj^JCx!~WMJh-H3~f6ExRY006V1HkI(sFP#cy5s{r9u zjxrfY1n28aJ6Ukj9uGUZ{xuUSxe=}qgZH|OdJ$87o$-`)BytGJCV`2PkF{K?sL5f- zB=!`|swVRuX&hq&Z258Y9qCukiA<~=2t1L_b3#pOSfVg;KsXr$1K*kfXd_#|rHDpg z$0zas06&E&fl8TF9H`?br60HiV7i_-+(Ds{mA46G12`Mh#2N_@?(rmli%Bn%_tX!F&6W_FGj4*Ugz5kKsai#eOAxJn$B`@e9RTH^Tn_ z3B&e{LsGhe!q+6_iNXdxiU-V3VUu65_*X)n7KS%5todOSqs;b6Cn^2Qm9z675i6ty0PQ952g4JA;5|O-D=YhmZIk;&ZIV=lV_qdRAG(;x?m`A_19?X~fnQuq(3CycyJ_KkPMx|Q5M2-I|QBo}se2JE%`k}9!A zPd_&Hs!&djC6OdmjSKyO`&?=s8u(HBHELh8H^Tn_59z)ji^0AbiFKV8>p``;j!CA5 zX(OIvE!+kpn535wM?J$!EJYP?OMHj_00fx*oFx6De{D|>KEGhsz8?607yKle$J$9~ zouH5lI2dvVn|kQ%I1I5$anv6hgX4hADP~+-jHhK%eDvb?RAYBaD*pfrsM?e1B_zE( zyaaLbuR<}C=Bpk=*GQ(Lcizc2-u8Fz`YHba1hV~tApMK}3CE~-(?yK@K=FmNR~{~z z)E3jB`|#;#-jNf!Qa=3Uvyl{d`hNMe`zvy1QRS8hRg{nk>5zH#s}M+Igoc@!y0MUQ z$GOjQ-|?d6)+wMKV}Ns&I|(^Ho`>GP2OW;Y=2*Gnu@b!I?*9PEc_pG<5=i}X4MLU@ zglN)Mj8&KQ-?@oDgY9Cq+oej-OtKe_Xy0iUNz&e0&~qAP)M2~ooNYtS&S-YaVh8(4g(%5qM2o=4&OSIS@T zSWnpTKWY!zf^Qi3J4ZJ@G5B~V)$~M)GG)E7+70!P?%Sh{CPAKMwg7$eUroT-+;S}X z6R7P@r@1dHwP}2w@1$EiZYIlRndOp%HJp9r=ccRXw)3(0n2j{6f(|$t+HgHRyMC4W z>H7-!wZ0&J!hR3GnfFVgB$g7W87d%=;zj5Ef`{_2$r~8fQ5lK%M%!6k2`a-G1a`q3 zkF9=+{{X=$uXOJo{?4Beehupyo%O6R-mTG}P1R(wo+#yu1f=n>c)na;qEJ!JE?{L0H3ty6ui>sU;0VUc%%LbSFZdi z{h~ZU@RQ;wSfnlSylXs~OAGaAILSq+ z-ul0G%`3}yeV=U)x5#6eDOUQ-)S}IM5X2&w0IWjW->3jCaga|f$0t2^ia%lh0NKLUT{7>(`lrS{8E=^RcX9kzy}5!E zWGopY)ROIY9DoBTz$cMkQ+Q**hT}lfpTrs>*lKO3+nrlaw3VcS+U&%Jc%x!+%93wD za&oE;dCf`UPlVna@jjZmW$JlqjDF7WouW3t2*2yw_RA08k)0Oqs5qIm= zA3^P8wr9jTXZ#Zb;r{@JJ||1@!$AF|{BwD#vuZ4{_?pJq+2p)}($(5a?J2bTrxDxP zK^!T+YziExJJ=s@@cxziQ)scpdEp<8I&QTBMX{{)TWzpA33u*7=+Yr5N)XdH+`)nQ zcArwxeh9^-$ky`elSvukIT5yu`>!L{iqezd_S<$#KM_j_$`xj}R@sBe;~e9R_V=!c zW%znD`Dm_1ufwM9{{ZLru{pVF&I?TVulq^qdX4S3i~a{gdt(Yj+J2+qZCpZKlU z%29Xuwd5q>W1-Q!S)=%tKQqJn-IegiKV-XCKZsID{HpU^$s25%BB!U!a7KT~>s<7{ z4%79pZgro9R;w~F8>NaBlaa|1CL50Yj!r3cts779&XFYVapIc@_Uw1k^=XR2NIZ?^ zMNDIZjC8GF@d^JV*db&d~2Y1CrFD}@g}Dgyf+sqZDyo1%Xd3)ut5?A zdFF1>#;n8w#03n&JOks;4g5>+K9BJi!1u3nqiec+SNc`c+er_fZy?-{vPD)+!;lCE z7(ECl%rt-5i{PKcO;+Q?o-pxG#19iksau;(M#siJFrMNIh#QG5TL`QzZo`LHAn+>?xdo@v+wAKm~#>ChUHW8BI& zjC1@nc^D=5Ao0hi(t&OX=CJkWs5mt5n?H1p{CB35B1KYI<7C#04EO_euVA2T2Kum=dETC>b7~odU4s4#a$m zk?b-(=?m_6ERL8UWCPFt09)Rk0Kri&&Db(vf1b3e(<#Eolj?^cP%GR)DvT+cJmhX9 z5`QZBH~tEV`)z4|v#*DAAB8>~)dV`{iZ3m$HEE-{RBby%Ta_0Qg4`J;3h|)px6EOJ z1$|YmYPMP~i+QhVgUh$Ew3g<1B;X`*qdO9P0;wd|8n{fLm;w5I1IPLlE$FDq-WzIHhIRS8us>eHN$FaE&ao zdHn~OPm+z>a%$;vu5GOD^!H-br7K0~+3@%L7rXX`_;2ys_V2%ch3RK?YvDZt*Fn72 z?5;Piqi~HR>=c4QNWAe9mFiXVoC@3j0D@9{HPikDd?xXi?dkD)7PQf=^jV_N`WbF5 zV{OySsCgb^q;bX5f6RI^n)%oEHvN+|-`fM@gdPoeZkIu@c<#JesN2CS8*64_s;tqY zG+t|uEJ?Jg<(T6D*Vmu$SRaboFTt@+efEc+};?~%&f$!w3t?H*e!(z ziut49L|Swb>iX0WY=Tq}TN#c>1eb0|1b_;RkTP?{b{;Q(jGh_$Cxd6zA+WT%_*uD&5!@SHGE`}v)!oMEC6$;$H4k_rSaE9u}>9fZFwf2 zXLAJ8*-RvI%Q*80w}vPYrC&%=o-U;xSx&l*?9xg;)}+FA(bh6O?%J83usb%?=7d*#ao*tJvrj%sdq}z7YTHBs!;Qa-4d(;u+ zM*jf4xGFKVbMmj$ikrs}_&dgWy@iK}Yz^L>rQgLcwu*A8a;n38P8Xewpr%J45ZN90F|HaEy+UT||?LwrpA zm49bn+M~q!oCC*tSAe1L#nf6>n{T99=@3PKeDX&3vTcPG-6Kh$fdjVhFg9=%g?Tv# z4`%tLN1I{hqTweRN$Jh}(oM9jqe}bj)c&*a1C97shHxu{vl=d}Yr#(z(rwdCr%scE zQ=c+zN=aG8``6Li^J7@itu_AuA8H>GyiI!Awy&vNm(1476c&g$NMVQ)6(c|qRGq4- zFgw>-ru<>?=Y|>&_(nWmd2C|^M1g^L_~@;Su0KlpuIv5@f#55PTiNsvjPu-FN#kug z%Sh1t%O|}}7Ut|gFRoP|F-YhnofIfh8mVKFK*`tt0N|M)4t4K}sqpLJpY3Pi`>UNo z*v+DUX+64|*(YXe8x;vI=b506StgTeq-V=fxt{~q#^iimjI8R{_oXd9IIG>YWUiM@ zyw=CT2?Pw_o(?mS`Um3A09bz0e+sW8@DGR#ny-g- zIIo*TQMOx%j(q16bd`0n3$5xT}YV%B(+xQ;C zTeW3l$meymWmE{=*DP3_p+IBZd=t{XD*PAt`=|I(^t+8GSdUR#Jwr>mjlO7E zhnTPb06hU8KJk(AsRw~yRl%MaaOGU8dG;+RV({)&BNwE3V6S<{OWxAeY^>e(KaoC_ zJ}U7pGdf%~!gG(+t3sS7IH=3oRg~}S<1JKl<&3RqUzv1g3Hw_3SK_aR{{Y~UmOleL zNqKK&<8L3##^o+2P_C;ZU5j}nU8C`>;@I+BLSw{KGWk%(DT- zm2wId6lvjO94u_Cl%pP6y6lvs=NEqdZ2bpEQa*6Lgbs1}Q`RUOqo@O)l#oZhKNC^z z^A04p83!LI;QoAyj56=}U_254B#e>ilhgCBSne(PNELI>PE4t+gnX-q%sumCtDjD7~1*fuksR=i|+ZMQ;HGRq*&<}Jv<>4oGr zd(=16YLczpwThcQXuvc9sMT;PHW+)bh#}*UXX=yv9@HPn7ZBJm6sZ z4x=23tvaD#&V}P(H^#Eyl{^4?93DvrJ$mzs%(ZKdwT5@N8hp)}je$Kuc_$w!dU^=hFNw4(hxwU{u@aY!Ux?RP=4O-=Hd_So8goKt6ExZxEwV+wwjG%@>vSerOjPw=DjdO+;Qi{7;+rRbmE|tBa zIq%r_;TP=1@QeNl&U_gTsx0)Wd^}_E^ruiQdu6Fj614V?sKub2B$z5%s8$Z(1m7Xu zm;V3;*8D2H_%lDoog>C`>pFI)tLj>9&xX7|;!Q4V8@AHo7Y5?+z~C-g;^GM0gS>4* z;X^4un)=_vuZX|0&x7L8w2f0;(!6Qo8>z0mL*i`;={(IU4g1pC8B|F+7mfbcaAVs% zi9A5MrsaR2f8d-y1ixty1%A_-C+!#TFTr}Zj%_?2;(<1^f2H`V%7W$zU~jftytl0Y zmf}cVzKS{{RjTs2#Z(&3=}p87roIgI0DXT|~9RLg0d^8*GZ9n3LFb#yj-2r_09mv zz%wrPL0hc8)gP&39jP$97W`MjB2V7yu7$DRWEb?s|^OKM^3}frp z(vsR(;GcYX*uWP7utz?gnWjyVGd9*%@`{m@_jCE;oVN+I{_O{Dq<)nw*68_?HC{)d z8LG^Z2?urCkP1E6%pY`Ut_L^=l441emd^~lel#7szGoR8shl4E^dhl244B41Bd6m*6DpF?uo)nK zjRAMK(Y2R&SjHHDcVj&D{Amla$gsNr%t$~;$vDXZl}`%6P6+6v9)Bu94V<>YQ9MTwDAH0ik&r1sF$C%NZvK?M-Q|x_5T#ZmsHmd-%upsrc&tHt|QqFAjV| z)iiBK#h3p8Xw_xXW!W=@GI>!Xil$Ul5)@GzsXr(?hyuS?{{Y~W{{XSZqx&9y%+V)} zG;gzb*Txb@tN5xGP-L=Dg>5wQbHRc)V!&`Fno-WtUoigw!6Sd*o&Nyvnd=&V?ThiF zPD%7#KJljT4u>>FmiF!^EB&P^p0LE|L3b4DQ~2qIwH^ zfg&jF8^h`|-G9L$JZo>Ke0|h>5qEQld_&>M;$&hmERixg@PF9zF<)JO!F#?D$K!w4 z_e%JyVWq(({{Vq}V{0szFDQ;k^!w0lE)_mg<`XfpZJU>bED0;MzAXO$f>vq13t!p> zJI@g6e`nRLw3+45BU#D`=V7)%fN;fPG7!9QNx>=z{WprUdRgCq`J}OGQ+LHO|qPpE8e}TWV2ZFT!0NbxY z@YjiaMR%trkK@!fw@_O`OG|5XCW;o$)8)#s7|Buy^B1VfpV%vJg1-xNUl6~FG!Fo1 zntr0rOJ8ZW5!=dfz&oQ=JPczUJ7Xt50sho}9`HSf#~%gjJ{K^>;(M3Jo$r4C>nIci1eqpqF@lIHvX$+YxGm^)@;p_g-Fg=5uD`o$6oZ(;imH1DI&navJMVA6WIGu zHu?y3zQ9fySn-Va#~J8q)(YXIK_>(&4DJKp)82)W)P)XI z5-_Cw-hJo|#6^QRD!J&OoPcPS6^(qyWb4r57|knK#UcVF$w$a#{uA2*puD%1TXu;+ zW^uO;q-Wdu&>@FU@}y(rCK!^yuNgh?JDhf;iYs~K+(`<6{HM3Ky-f?OFa(*xoE$40 zk@)`rjTb8H@sBN)#z-nS2OMYHngBk<7ShPuK7*4{n57Ivh^{!=F@yQ{t2S*c@Q`Ex zsOOGFI#!Z5A)Cxb0I)bLw8yznL_+}%eMsbFdkPXpR{io4**ktxIIA%%7XiGcWnsY> z!ThLuF(g4-BLxv!)x}1SiB6&Mj;c~nWHAXr2 z$MdI6Z1Iiio3q_`Bikdb10dR<0*#FJVn_b~s)8hJ41&sV#2$x^KU#YTKI-RoI1+rU zeK2}cFr|uvm~022QIZI6r|G5C$~s_NW$gIUym-(zKB%&=P8DlBPX0B@Vhi4g*pC7UeA zmNnOWXZS7q6MPf!j)AQB>e$jgL{txlT z#7%nRQqwi@WYXPP!6*XS8@NHsTSIJ?;qWqy=WjU&=ey6@tHoanz9Bz`B%4n0J;1dW zT1?&#x*C*s(3EEq#v;pSVw16eU^&1TG{3ah?FHh$+au$(&yO`#lG@Tw-00eHW3x@u z(4B|}LdQFpj;`LA0=I;`dGS-g9x01f_#fg;U&GSq(X?{v`Zt)ebQ_{ggEBTT`?1R& zymMcMaV9%0&T|@hUJ8w(xns`{jnj(dZKq`1t?svGm&N7&ulPyAdB2AI8!Y!T#VI;* zlZ_g`!dQuW(Mm}<#uT@xmok*Kf=>78ya(|^<1g&js7>SF1^5PQ9}sF5#tVzhd%@Dm z){ut`79%Q!UDz9r4nl#(4S8>iJWb+1h<+{9d~f3m_tZ6QR{C4LM)qV-^Gxhnn1BEr zo`3*40bc3gpZF@j?aXy+PY-H88P1<|s$8^s9)sg$Sv4!@R1jx)mc`N)VjQSuI01PP|Q!!ZW| ziB+$A8<5~|m`YfAVrnQ~-KMF<>uu6ib$#ETW{-!+yhY5j%ziI6h6@cUi8offtJJ4x z-)T-*Tg6{h7S`9chsyr|41Nv#Qux8*D{lyVC-`%$_=i%ukVgf+jit#e7Gf8cRl*K= zW@S(TB!SI-r+&yk@J0Usihr_Bg`xh_uo#=Pc7 z1>`)PqY6DiqXY=qKpD;eE1$$y&}956fWXv_B5lq~RHTx($vG?e^E-6Z{7b}78*}a@ z!_OSnq}?_GteZ|AHYX`EZ<1<`CtS1oDxd>Fe`{ZW8c+5;=j|`>@5UEC4DpwPG;6!p@g9+8 z_Yz)M#S6P9XyJba|*eq!w-HsU30~!8|dDTRb{$P_C4G7T>YW-Uljh=dY{9MeW9_k z@fGFbU+LP5hG`^?T*inqfcRaV!CZ`R2<*RX&)K8lXTskJY5xEbJ{(yc65%xn?PRio zW--r{VywG~DC@Ja0QzT|_?O|gk9;@rSK+>w@w35NmyTX<5NkKH>KdnuBesSg?Ne~= zExnY{vU$#3T5${_VFI?_HHx-A$NiLkGq3F(;N4gDYWVA~&3$`)3r(Qv_ies?$}_id zIcGvQsXVaWq~ieor3m71*nAfd<@4mBN)+LUqYjD-mRfBtMD~*AQHp7)G7;i}n%yre^r_@XhpJ6WsZpBkBfPu+fN?7yDRyHB`4*6gPW$(~4THZkq~6s;65{;ooOhku}^Bg%@YDsBY; zZOejBbDn=HLM;)>tUGpK3}gYvV_!YGKD^^>Jaysu?bdNP3nW39hho60Am*ct1Q z?e(sH?@RD?s@&Xa-WZ4(U}y_KU0Ip7^f_E~Jd6X*F<4LAU2-M!cKsje>S(Nbqw2PB z>47yJY9M1(6Ew0!tXp?3RbLnYf;F5k>~oq!B2-8_M>wIJ{;9;Egs%xTbnN( z>nk93P`iM8mI&YyRHg!u2n5%k_;>bh_$lF!9bI^zSMg`Y1%i8N;&nbVxYZ%Hnm|VA z?VUCz+<=%|uTWIiomu8nT#lR^UXR{)x7?NfWhD*nd>P|^fgcHPJSn4S{{R*>4-ELD zPQ7Lpcb*2Y*DP)=mNsO8oiF2#S)%fp)G_kbHFb|Hn^}6lh8`dAmy5hNd+-Or-Y&S) zbe|PiT@$Uh#N8)DvJzRfw8GwNhMHk)WL1hai7i{qMt$LelV6}ZPwZ##{{Y4o7n-NT z-;Q1u z(dLaeU7uKq6z3p-e%Tt}05*uq{o#NPE9J8+j}=c53ixVsouz(Q)#P8|_nTLHTTcCs zsMSqc{{X3>{{RGO@Ctk}@W!d(4Qs?}Z{nR#O;0<*l6bB4o4aUWx_2^}+8B)LQsx#C z1lzV%*h+#2*>lAsyq6aehA5;7F@^x(bUiVG2tQwH_zDmBC$GetUlCc`c*Ed^pMPsE zBbQY0m&E8}2)n}o`|b4WghUabPc0!@t5O|!jbjs|89^ljNSACEac!kln0whqA~5bR0Essl26*j^9+|-Q>x$+6Kj}^4Z-g4Ih7wTMa@s3A5<0L|x`mDk z0>t5RLX40x#!0SsNd2m`Zxl;CjE~H;cKI zn%wmZqXSJVz~p7l?Bs$naf8yPvW`|@HjJ=5fzE!vg;APT`&`W$$PuMt70yT*rhsbPX9OnkK0>sww1Pbv;#Gm3~FbA$bl|IHO_ZMucgM?An*NT=Mj)QVA0A+(W z*S#go(j<7cD%r^6t}*NBK({4={t0ILG`ArcvKJ~zKSF!^Qcn%sQY==`89_fYvjW)n z^%Y7e?paxzaw$K>jy{>Ikj*2+a_mn+SbW5Hpfp++H2q6x@-E7&ayV_n)87?tXw{DV z4E6fgJ#u!=RSR|)X5^1^(0yx5Pt{&bL2(%vz>S+3AbQXyixNS#izJ(Ob-?RPXPO{F zKKvX2PB`~9B#5V!z$9ejoYW+;U@~Xii~~->zJ!A0xC$F-IpCa(Pz<;Z6?y4{{VEg) zP74Ba_dv!6K2atW~T4!V-kKN#vUVlMN3m-_%M+7SHbN&_J zpYTx++X^q)6X0~W{v5xBd}ZP@C69z7f1B*?6nWR~4;wAj!5QJEcvp~H9atO|Co;xU z!r|k2&Dk$M@>{pjU6^9AG%#3c;ww8wD(}<${{S=P&-g2E?d5;3YubuINFiGT-g#fbvbL{lHkBE2rM})i!4y&qo!&25{woNUp(n#*n_B?ZW=1tEj zkj%2Ih!7}Q1M=!Vw(-A-yb=EZ1e^E_ejIor`p;JQ)8i`@n^x781IMMpasw)``-pc4 zm51*nR*}ZgBd^*sY}y--Eu1aJG>cw3V9 z461RJgcduJxBL-P_G9r6#{U41x8JodkD!|8MetSQ%V&9g^R}tt89{Vy?aTe0BsUJn zC(V-E+z-}?oLrsG?AdIwEz38lC#m=EUlWMLt_H)@%CJ-RxT>E1Clf7aIs8gx}v0YLN}&Plu)LO=|dBcaBBLsb!4IX6b^Nx>>l1bXBAnwg{o z{K!-uq<}#Bk=niuw)Z~!WJvKzCK$qwao3^z`JhJVHna!W=fAPVL=jX5^2h{|3UCO` zAY}v?=EepwoPK%hK=mXtTjUwgqa5;dHS!N;Ww=06^006Fy^sHSa_ zGQusJanZg|NAmUjs1ft${1tNJNYnoS;GBOI#pT>_rO$`0?X85;6%tPRjhK!#z{@dk zHm^cJ2MdxvGe6*#+7kGS_M2Tn<2cdui>snZ<1Mx&ANdnMg?&T+00sT{>GnSbcpvs? z(Jq}N)vsjnHol1`{JYy1x3fd)8h5ym4_kFSai0eN0D@szFM@s2660k?xLxNGshS-5t^m(%sT1-5mnbFhUwhsg01{h%sR7dG~(Zm+kJJ`#XEVntWde=wwbm z!C+oF7E1upAhGlBj)M$l`Vr| z6>QcRtSRL_oG*lS;?x7Xm07Ap5vMc2W*hY`g9!(v2^D;A%_<`DmmLd!V1HC`*$YGV zOqEAnCUg?(0_n)~rVVzQORrfm+l+%4G>kb$COWMT4eB2MM(c^i?~W_cJ|;GNNEZ$O zT%>DuDKZfqQxSd@N8@k>@5**!wyEK~dUqc^B}24E?{wis6EAe@>N%}>_UuUC!P1*U zu(m<3AcViihmm@eDVi^eDxxmW8D`3?#)>QfG8U`S3BF+~H=Lm(cdOt4PRkZ8^$6Aw z(Y7_eH)06O#-KKEr2eSoKLeZuXa%KJsvlQOQWs}ZOwv%Zph7y;lK5WJXJ*X3f<|as zs?5DqKYCy8HfAMtT!VPhUXjz`@cS{9>+ZEw-qXny@3x(O4B(=}D3#aDVW!6ZnyT_< zf(ZPP#FUaVOR$Ae$o3$}@^OKxmHyA+c9Ao-YQ$9fB)`{X5Yd?K`DNn~{%U5_D?ASO zulH4Rtl8M@NA%@1S{jnJ$5COO##X6lW=e~ZSw|cv^R8iGD}O=W zfihU^^v{ZD1sJZ&_A2oiMJas}66aVbeTDg8@h+SXr9=N!hg?D(nI{?{;Yw?-HD4iE zdkf_k-9UK)X3h$ZEAEq6_!IIlUz_R5pBS`-fCa<&5cP@>nWZL#6$n6L?9^+Yk7s`R zI=Avmi|OV#@y-=%s+=M&q3X$%#boJN8VMt1!19>6U~oiur|;9&L2|q55%;~$Y>(`# z08ekZ?V>%06bMYm+vc$M@9fgm-6yH>RR)%YW`>>XxkL6?y{9SW;_1xNu=3Vw~m*8X=-{SD|5)VbV2?NUN^-wF;c2wTieFWxRWy{vo4%Am2r zJs|jPc!^S81!ov$?(>Qke=?+)>-g2F-g&R62WzXI-0j<1 zQ-8dueTqZ%2QU3UUBkm7IuFo(A0h2hwH^>XK0wmn9zFbcRPqm&$^-ib%OROLyfnn4 zCDo>h`|CD{88#JUG0wQo2O3O~CbEOfd{`L}-`d_>cakJZ^&M<;ynn=x9QebQA*hr` zrSZYkzx8BD zpvN)XZK(WiLV7Kz#HGn7gaK8e=Xa&O&@W;G$pmUGJLG9+uFhTQwRQcBqIp~3*7E&H zn%clyRZr3EpcOYHZ`6W7nhWHyDYZA^I7oBBcN>n%wm*@jUlD$i`VXze*`I&zjO{?d zTJ5`Cj#z&y=JqRv93@~ELgu-C3#Pt`u!9hRc1JC!Ow3W#oF?|G*oMpxYQMSUbnmLzyJ$;BmvP>;{n{V zMBEc>>HD?IkCjf|D=8W(XXd_i%SZKZ|7I^IswyhvyV&dl&!JCD&J3(je;@%PEE1jr z1z7Yg9Y>A6hxm_d+};J?C!od7T|#>KeJ$8*wazEmEC&PD&YKZrSTNba=S*3w9aDJS z5}upQ*keXNa_Z~%*P`DFQ*xpuf8@UoP=HuZsZK5QiBQS(D!{T7E+6!!ja=hwl+=Df2bk~ z#+aSefB8%qzAA;5UOilHHk}bnf_GT5Ik!CsCGFfAYp723dqIPwq7{$Tou}TbnSU3Z zgT*&yptccpj_(P+<+JlT(~HM8rN&v8h`)pOxVU4z48`6>!U{e!{7B~mr;2W zAp$ZSglG+}mw$ZAqY2A{6c6}B`qmHS)11Y6Wz6cV0QM?MTM1J74Q*igknD_45+BlC zv^X;>750-ZtiNaHU`a>*HDnDajjbw76-`p_Q~^wzGV+`|``OPU$k{>kz>)cNWiWf1 z6|emg^0f=8skE~{YqRUZ#9p(6at>qKWsvoL-@4rRS_86erBi%4ln^V~0-}|+el{_P=X-@^9FT$VuQ=Tmhpjnr?WXp}(@s=w+lC%L7Uk6OFeI1;%BRsx$jbWMEZ9sl%+vn|1b0ui4_e)^Lh z>?}cJK3t$WVoGxnX?4No&xMcepz)@>C&#dP%3bR+YJj}^gQ%YyiEl>TA{C=iUEOADvf^uu*)qD_Q_c?n& z)+M}scS4-+V4>6HGnH=EdGBRbxTDUI_-M|IlF-w7A^S?iC`+KoZE5m=5CX;cM>!)D zM@;dk&_Hw4k=cWJTnBTEqPi9blFX4K0_`Y19 zzs>xc_8R}hH~LBT6z`iGU$wSpeuk|aP@L{2N<(?M z)2{{YGcA`U@WzmKov`QBYa!HmwkxlLLv%Ry{MEb#vQxB)WsVu{<6j}ibDLB&_-#h0 z@7%!vlNftn5C`k(g_Nb90D`w?;hSa^4tsGWEhYPUOO*Gn#9?ciym|H8LWZSGr7>HI zW4g4_#8=!R5H1k<>=uNTI)GKg zXoM3$U%LYPwHO!9cW@ZS!YHf(;ymqY$&Y)>vOQ;g;kv+Ge!m=IT(96! zJ(1z$)c9k!vz^6VSv{ZX;^i>9e|sNsIcrA2Bg+%#3!BVM@fF}($gsfO$=RuMYGV2h}I* zN1Lsqm6_T)hgqf45maCwVWvoao|XS5Zt2S|E*y6b`PojIq73LS2r{i)xcJzdHOb2| zH7_xBWeRPqiDhjUVE$0ZoI=hy@ssr>25vd)zS1jI@x~PwiK?9_cMcJ2aj=mM&ad_b zl9i>2HD`FLATea?(f8!cfH{Ver?3z+WGqwYoI__0Ti-ev6Q%aMDe*BS^DbR?_?gX7 zoL!VjosI^ZaJKDyk~}n58pb4<3nv6MC}60lss@@;}TA`Jj*BPkMdg)jguJ5A~xaQ^uO9*MfQN%7lI1#c{-Xi(cSwO zr2Z-5aO>LC)rfB;AN+^rf1>6_+RWUAi!V%DX?A+d#Xjf1BblS9e^oFY~R9KU0xRFc{ifQW!D@W;0F=Zb`wq z*HHC+yPITM@WM)Ue>-v=p0wyMK>RgI1MOV?5pA(|1%~#4*zEW1Hf;Jv-h&VmO*j`8 zLS!`$vN^NAHiEg-FXm+xT;~|HQ+;e^X3q7ujv~pn-hHDx@l}Cn$|j{}?K=ZM50mF) z1U;l4#{Hc412w#Jk(--}ceHSAM>|bch-RejwgeJv!Z|{11 zQUw`EQdwvdsyV+U@Tw832H&{PaX$G-nQJP(c8_3_TJ!4 zoW1YUtSZTY+>FYiAh9S*1QDQvaUw}v#3NajKS~85QTBJ>>Kui|3%vnKyd2eJ0&=%< z&~PIyp7_Fs0UZ_yavu<8DZO+k=(B=4q^Z%{VGZF^yTzVgqedMU{V@XSSw}&vGHe;& zwEL|r{weRA>*>uIBSfcfGJNlQcvn?^xbOaR(B~Zt26H_TlhkjKyqRZ&oo%wXuqqoJH{pvJL7$YW8#ZC&Ik&uFm`JFQddp#~&JyK%AkWsbQ>#hA9AneUC0ri7aUbB*cR`{Q!$+0iTsD{*Ns zfBxO_ic%539T#R7XHx|iuM2}Hn1|zk((Fa3PTe(sD>^oC_wn~I*tz(%brY)Dk!*uq zQ)wHKXJAE_T-f%$1=E4vXBn`sX?$e6vlu(c5?Pd(;I^|rZlz)Id&NP^^t_K0)>tE%m~)ua-|lEO3tkFLrK9+qvVt)LSgOc6G9zhe zVJh99e-M6|HkJlQIib_+;L%T^A#!9NXR+d%E<$9Si|kn1yHae2t_l;}abz23{Q-Ec zAh-t#M;%?g3wEM;3k~aL9x+0jr730tGPDjILq$-V@32unV&gFKAE|+u?fYI&AV`vK{nhtL-q8Z-D*bh3Gqfb5AL`n047xP`glFE zQUV0gXNl=!#tBTeUb*zo-U2F<(@!RJdzO|5ktN%xDBALc*Vhg8UFu#%;dr-|H!t2O zvoqOwue0AC6^?YR=HYAj^`?K4h-$E%jvtlr4=>V^Iu$5a&(<=dpo^G_3ahZGu9WCX z7mWd&XZobMF5=e^t3)OTOtE04nMW19O*N#kR0^bFD%A)iM<@P55|?P85w`C){CNDR zRhS*RS6=RrbI(G-9sD_2e$DgP#XEdngmFFpv)W!dj_(wvtxY#MLF-&bGZ#N#n_l8E zQfoTTg_FY9=>CODNLK1j5%h8StKe8el^7@Wu?K5-3J0?Y0r@QOrCNG8Z#K>)U;dl- zRqH~@SvMu&kGs!7EV(2k*fHS)HKVaW`3$(OUw^V_-9fr){9ftkqi%5pT6=kBux*s% zYXvn^@dpQ6=~Tn-NWBWlOL0{}pNt6QT8yPK^#rzWT(;FuHdyRsSU;=VI+EYNLPL`$ zc>ctr7|d*Gyc{C#DcKC=ThYN`o08HiicbBiCsk#@bC@oVY3cncC<__9Nd5!6WuevV z_?_TT>G4^jmA&Y_YSi7mN~ICqp;2_Yz*?uGdzMprJVFdjD{g*7L zc=wB_9mQ`o&@?1_|A2XL77o9cH?y#Xst}A!I1~5&bB_SK(PY13({J%-W z7-a+&(}Q0;y$w--%nx5}z9J$Bz!>iCHnAUoIkr!Mf9Y%*y(v^p)z2~EQmOu?bift3 z{6VHDHq3a$^`$izMpc<86|MxP)g z(sX{hLE;FZ-ev?Kd=XbDY`u1{8ykr#z21xP2w|+)8N>P0Z0%X=tv$Hqi#u;kIER7RAY&M&g{7jE#0289n3Mf&ZwDxW9p z)z7ExP%a^G_!2tAR(yq5o8H8l#_?qGVu)S|E3!%?4A_!#+bO&#KWx<94@Zz5gG&1R zYv2mtl=)b;{+_^>wFGXCF$v-+?pCzq42jfe{Ag&_{aHv{yeALD|NosxdMMEJO7-oldvzBZ?{` zLtsE8uWwLQ>h2vizSQO;E}yyF5PtVW*&hp)(kZOb35E{kB*dFV;h#|7!1&zUF;96? zpbw0v8W;E!j?b>zzifTuKFY66D(y%o<$$Xc$g~HhczlBJ!9pNcK#Ms45>DuhlOc>4 z)xqT=OVhnVd896Nu)efqCavr|g~OF&!0t&eFqI6xA`y3?j~&*plppE;X{wWhO0B+c z*l)<~%Jf(Fxprotfsqi?Zjvg#Nt#oq^tk=DxZ%Ncv9fCFGXGvGe3%JfV?jh3 z_8RUmRzfKFyW7HH@$Lr{M~}jg|1WC|5HnRTO2#?n9zi-kRJvJiuzZO?Z{XzO?hQ{J zzzOg%h}xgR;#Dltq?u5%@tu;85NElRXrP2DD7cZgxtqD8;rmNG+JE=Ji^)hPW}j2V zKF&z<8bPKXxa391Uc$H{E!{4j=a-y+(lAiX8i~CW_yFbcvlog{Wd2Ov5fE)5A z+&TSoK-k6{T9jj!ORy~%5aY0epjzZTU*r`AK^4=ZvNZA=JkQ4H&{Ox1x_IRl*C zo6?F$q}NPkUChtQ2jV-;EA+D*jsO??dyJ@!g_kIUgjJaGP}T;!@mHV}*ycYp{*-A<8IUt*u{~1-~LX zGS%g}9d`NLAWMic;Oz5xj)Z1fkBM%5(+=)iH_nMhf;+Wb2z| zHZwo%@E5rSm5QVUZw5&AAMcJoD+$-Btre)MncU?xpZWhPRRDsLYrXt%tXh3p8+pHg z-RKLpT%>+=i6B|RhbJVDzYe+*cxb>`D%a0;UxrAz7Wj@|tQH@4UaS`-bc!DslX|&U zQ0rQ8?w(QGWgGruAF|l;F^A8iUYJI9$t#~rMOGK3^()8yt6g?z^RF6ltW{|OY__Ns z!*_(zN<`n+*~U~LP>QOkj1bX*uICC=)2{Yj5*GmPq?GV>N*eIvBz+_o>a^GhoPF`; z`QTH}*a78Edp%vtt3i$My_mo3YKZ{kXM9x*I(;4{Ti)OvmV5u}fKVT=)ri-s#OU-8#?zUri5_4{$L4dy$`@4JH* zy+X?}SmrKz-$tqbmSz*G-_AR`Y$$WO8HgKh7okpkv32Cxv`)W5P_be=g)}}EKByP_ zWI)H@#Iw@!IB*n+3muH@=iAHF_*vuhh?xWeP|lGzNLs{|Z60l~^>E-9R168$Gct=j zH2t_Q-2f}XEB8wy%?Tm9KqB(4J}?&_f$=zKR{zq#LrVKPr}~9f{ZWj!HEGT(d1}8I z0rn147QBbL#7m)AjEpn5PSWT3BUa9cWa1hu5W%~p!%~@P9}Vd)^d1ggwBshp6(2g4 zp5$yN{tdHq&E zA7->dG8Q&|OgG+Yi=-T#5|@~|yMOenQWM?IC&rqNFht03yqvV|47Ovl+oJS|TnW0L z7hxXtVadYZ+XKr+JRYCuijM3Zuv63Kr7i#BQgrKc(LiS<-q)1fD5E?IJr~2r&0%NC zoVjjgC`%noL2>&doFm4~xgaOo0JIbvTB9y+!5}nA=x6-;cj+k)QZ1Rv+hK741&!{> zQcPP^?Lbw;&pBhb>F58@jD17I@X4+ZN+cs*VO2Vge{cB6;&N|q2gJae5Gqw$H(LEX zB(Bqdu3Pd-NKNO&f{!!@xT9O*^G{i$gYZzL<78iRn{sN8G9<0~L^DpaH-W-7ou6iy zj$|G~`cM2`u@KXyf*3B=4decYtwqduQQ}vgs`JZB5zKo1N~1)1)%ZAAI|Xh!28MZP zx970^1z1?={R78mWn+j`?Jak z1ZB{a{X1E~F}Fu}>5X<(!U-u5Uw<_Umf++cePsL(O`i63)shzXL0#H5jGC6tC_J4%u@z(>g zhW#>|l0c<#j}?-^E@2e8pXNzTonecyTP*eQ?rXTL3LZYL8khrw4#^>{aV$=QgKYzA z!K@F~J4I_wvYWzs^gG8V$_V1ZkTd0#V*1WGM5BOBi%VgSy)OxKnV)W*WW~% zh_1NuR2#%@ABlOe0n^1ZZ}>Vs#`ByY$>6BP_mT@W@|OMurQA;_Kv6RjyNTep`K!)_ ziqBl?C4Y#gymLGWRz6L zile%AI2C#^i5S@eF-7GOCmFMt2a=-H;SG~hSVdkZ7Ui20FXm~PW1rUdIK(AnD{dH|?h0Is*(SNqNP+jEQ(;3^IbW#;zxYJ1>}p?h#OSX-@4E``;$c9_NEO{^sNQA-5X zFc3a$-OxP196qdm>k%iqBpm^_7&Qq|X(d%KQ}+_W4`rWv)W6z_R?7knUij=0MFe?n zyIZ$+6`(Rsa=m5*0@t7L0+JZ5%(*~-#DRCuD1q+Y{w_J(`Dx5FE)L0lDw^fwDeuA4 zALN&2n+wZSe*3X+W6y?HU*C9Q$$Py}^|@bIDjd$$)m&wS5blB6H&dnZ^t0_hzg;zE z$pp_kHrQt}OV8dg8RC|h)TmbZ`(g`R_kaGj-&2^>7V=VtV-IqjePws0UsKLy{0mIa z=Wt;7_$#?`#OUN7vOBS&Wbpbj+pKr1-h^-AxdTEOUw{?m+HusjJ|QGsC&@MGpOGAn z%{d6cUC5|VrXt}tlneVj$aS1dD&=1<*lxP5RyjJsYMDxe`AVD#hE?;pj6a;9s>=z) zi^XEtIT~ow^<_PHJXKRAic%?FulIh1dyUO_a9`;-phc>rTS6@`;ruNni97ubJCi#> zbTWi%X1+`-_4Mf}E-}Ji$1fz$pq+u0S{DGN}aoCZ7_SAnPVxm8~Aj zo1r-(>zB$0^kZ&1k_6?L&WB`UqxEsD~K7Kn~@Z5+{avRjx0GXa_=XxKRv)zY?>-54ePcNM9ZduVMO zFJtvGfG0&dr81Em;<964fH_B_bWEyWMv2Pf{WwPFL>qS-jZu__hF4S|xYX54jn_TE z!4h1BeOz)|^RMDZxs3#qx6rA;thh`&sjBbvO>_|oRlur7s`o|JOyFK&J+pXnCGQ=4nR8-GuHB`jA96UP#`HgvEB=}(4vG(aGl6{)g*|V6 zi><~bDR?u5MoOgFDD>Nj%5^cv70i{K{Fs^zx3}OP!9_V&><-ejAGDn@!33RwJy;PsD|rziLC}`2+HPC97Y6B0;i30P4Rr; z!*|lzJ>?@6Qf2;ep!oXEiN2*y#>fwIS+(1iO4a~1Nmo%B*7xW6PZB^#-`@7$G^h|r zM>ela-YK`Qr90&Py+9pe$7T|Qt#a&>OS5HBfD+*tGsYX3W5VSjyD-f@2=ht7)Uxoe zU~Lch``bRoR(XPq&S1UXj=)6JpCy1 zL+rE!4)rv_(j@lvkAt>$;LkybVL1F9{JEt++zz6-=Z{beBM2bKT^=V#5^Zb+B)utbMkN+QheX_e+NuV<`tAYJhdO!FB}W{+B1QF#_*Z&t+$S z=dFr%!5Z}W{Jb8ol+z@XE)e{_{G6h0u~%O`)Bs>&H@nFb}$+XW{upknCBa2 zu*WSn3-wKFYRH3t9@$}~_myyFk@gJRcQaAdm<)gXmOrVkbAP+I&REfPv)s+m5%c6n zX^>1FX<;aYKFSrj4(PUfoO+TCd0TMyK|Ss5{Y1f^q1HvWZ=QPFJ0O(Cn<(ew-d7ACTVue)7Tw>;!%LYF2yW7b(1T&mZi7nZ#=eEvZoxf)C~7|0d9)Q zaOn*ZX@Lj(W1+Ogn_$z@aWMl$o+F5PG^R;du>hTb>8~4e^kvM^^Z;C!>n$X%4C;1t zKUV3m%*=!3f5vfP4ihGYiYtR{*vyM9S+l;d!3Dw<|aD|MIn=OWi7{z@#W&1 zcvm8oG`l;}7JJI$Zif4eV;)2Z6UbrCufzE`UzO&@M&9h~>~dRF;}EOu3vsjPIj(yQ zB=)=;L>_?$Re<$F(o#!CMnTnMMl2qLr~XOgCZ9JI>C82ARbGHx5)LIMY~@LgDc~7< zj8Wm#(r&e;jr8*$!)F7K!g^AOfA7>JbmSO&D-(q71whE!lsXl%E zd7yTmI%_ViB%J)kuzZEVq+|d}kAVf&qxF!@15N#N?Qrh##Ewdvsvh5s569^b^rFAGibDu_3ab}7 zeWt|Q)2lcY2XFuhfb5A-xS`0b5Q0K7=k0UjU(UC%BKL~YW-cc`$FqsW(S1ACyuRMs zV89qMchF{cQ(a+0cs?rO_~umPFv?ockSz7Ya5;JAuS`gp}^HN zE7k7SYVYtCPafo&lb68;!q<*H5X8r@2skZd4T-bt0IH{zc|RVuQR5sY*%<~H|*5hDB`03hBxg_A77a)^RW@ZPV$FU9_vP{QO@A!VV> zabLV2ef$9xv5wnDbo(vS4Y+C58d5A%MP{GpDle)Xe!F$?Z~RukLLJ~tJUbJ0`!%+v zP|?(~`Sjyz-7olOm}8_V-74@)cD^o!raHV3qt+VB1+voZrG3=@!hCtaRW(hX!TznX z&Bi_O@eZp}Db0=M+JTQ+0*!Ktn(kVHA^*ydo;8^U-91`nB2>mp-l)L!+k` zGPW=#b|&g9J=IaoLYrjS&zjs&&gi>txclaPguap&kR9U&d|g%Mwl(Rgmr3K39&DLf z@(b`fe?%zh;~NS2s}c(svb4F7||&Jx1jE?-Gw_=2U3k#rkQ*Em!@ zo3X!o(RxwXobi(~N@f2GvUWlLBo+4OzBl}H z+FJR21wN5E#}8rsH|BEQ=&WBrm0Ij>iv!rFaf1V)oDzqeC3653yRgnPNsIv-P@sNg$IdF?(`U}I9*?m}SsHe&1;aZq>min(G^5tX*aS)19 zF4e#Dut(7{`f48i5ggro)bbQ#+!!`T!zfV|%ZUyVlPwM!=3X)wYgwju0pIAG>*m|! zj5VIA@1M8c#i%lF4})i5^jZG?7kOCJl!!U)+{iV z!%OX%leqX~=Q5ek`-91Wk?*V&S|=+6PusJI^Ml=>Qo9Wb%PW6JiNCyCFvy8#^JC{7 ziU`zaITS%HVDiDe@*Nz=YK}i(^eV2Pq+#T*Y)*~yjk1+p_?z7k(ua4L?#B5)Tv@C% zR<}|GYR6fMn$zX2)a2#&-u8k`da>EQsN2a%)88pJM*VHq6P3}nC>H7^Av_=YcmU`9 zWN5JLQPF*KDGb1Wl}cOa!1%LZdx3j-YZ~_==i5Px*$Y~aS#tu^q<2FuG7{X;JB%{o zNz3o2&<=%hEM2;Zgc9i*|5)wB!(sFPEPA^>G4DgJq^j>gfZxX2On&x`qz&Q6B0PG$ zUYGybRYqlLdDp4(ZKsp?87<0p-~6^f`IC4sAn38gw+y+qOEe%DVEv>EuiXpAn?zuM zy1F3Eh&Lvof5v}R#gJ7b`PR;5bfz5EsUFQZG4l%uN?s(8*Y|-m&o$kk&7dg6o9Ci_ zjEd7oWF_QAcS%|aC2P~64OLrm==izF_nOu}pm8KnyI0EXM&4nFb7G*i6Lnbz0jN%b zvEH>L;m@>sJxl%S^(p56p~>ZG+9eWvc=_UbE`Kb$%Ft%aH$ywfF%qX3 z3fNzb!HPr@Zy5zBD91Tiv7${6nuo@qFS$mPH5mz5yVr79_~29chn*K^pMV2P6Yzr}R6VR;jHo z^#nhC*56;WohwJm_NMugxjVt=fs-}A<$^fw@~{upAJQ){NEc}4#!wu{kh5Rf5_ewP z6b9TuU+pJq3{lK8Nc+52XxP5Mv!lE$EpEc5+SpK_Pa5bwjo*N+Pmoem(Ff?*QN+tU zq$zYlvyDKP{?c4FY_%U(?pSYr@!0L>y;5_`)n%H~cxl5$w?#jpm#!2}qStsE015%t zG#z;RL}v<3N<1#35|Ei_v*Oq}g(iV5FcINZ?$4UvW>UlMPc=B) zB0uQl_)^<3k=)qzAOItE+#?b%`=PPoX0m@B&So_hqeg-c{7`145nblAn(t$ZzY(t&@kvwX*L)OJ~5H% zU4AG|UKj3PexdHcSm-%~u}l|6KDh(^+99VX;A62ZN|4q;sr6fbM zeFlpurg9kFHk%t252v>sOJ4vu0BVR`lp!Ip-ybrs1eYlb@CR8WizI1(ca$7V3K9D8 zkH?kK7>d@@wj|tHdLf`z>d>8wJUUWbS8reo(^72;(N|VWa&lQ%%9c3#5psh%1Sdfa zf%7T5)FHai8(_gG95|9&fbpps-gTzlViVZ76DYK!XbUw3db!rJZETPIh`v@wpCm%Go-0uscpZ`)a&@7)f|g2#mKfASbzexK~RAswG} zk-ISOL2j5vxLs(wK0}M%b9|l3Fm$XJkjH2;Kq(C7RT-}?SN&yU+dLa)ziIOC&y~lo zInG0^{ofS$Jnl|SPM=I2Serw;I`e#MpK1=Au4Nh`p(O8U;xJz*Gd(W@HC9Gn&*J8> z3f}q-(_9RlsQQND&!HG$%UQ1WI6^{jQ7cO~EA+0)HAdey@d|$(%ZiCePT9wznQI;K zkU5yUJAg%VHTiuFYX%?3C!!(>r)KP$xB~2m#e;n;3(A}AX8D~dP-H2IpZe=5`Xly| zX_lwI+;0pwRx5dyt?T2R#^EpY`9Hpi>)>%&lFv6PFlVQfh)JnTaYO+gkLp>&tqVQz z&6=m5CNX`15996w<4Hfv;f0Anz>7$I*T?s)hkm;0?fXd^K}uUNYFt_Q~aJD zUWqa12D?U2>reK{xU146Z!2ya|0y@&QzF~{`lTO(cRLYJoTaD4@RjB@9WVbkc2zTgxuI7W%WZ87)sk>M-m3g?s$13kHdAbLzaDhztrcB(LB92rTWtr+&iG*XZZJ5d zaVwd@+1P|=kX6x>aCJ_gRAG5(z#MvvpyWd0eBTQ!)Idf3H!u1Ix5$eQP_>t8c`I9z zpm}Hz1H{I^TtMj}ebljCwgiK>tE3VAsR6)WIEzq38`Kpq4*& zGdNX<{Ehgjn~(GWr}*#h_^uRz5GSG215$QQF_M^<7Cg~g3+dsKh;OJTY&UExXm`va zK|5>~1r&*VC>%wVl=xEgKvk1S-`3a1tiym#ql)gSHtuCJtVMP&L&=`h!iS9z3J}SY zFb4S39z*M1qptD7C11z*pAZEHk9xLrE21r(O+d#twZ4d|58{?82Af_Fe^B-#78nl1 zKF+_+X}4VqN}eX3D$%dlcqaL4t~~G!E7L0%%uECBIaLh_o|$(5hf!fCt2%YY_)3lm zJatxZSYy}H@{hG(n5>OJu}OkfIcwq0)7F$nbNGoC>N4yDsKy5H;hmsn9K;KhJp+|p zgyS+GSgIB`YOuLBTG$wLdiL?AvcSbcfGEcngXP23yU_|4=C-;l3)ApnHGs1w1#*Is zP=qMrKeTqfSYF?&R14yZObc>&;jlSzj_p!|5c9~vR(UDFM%we0^;tf>%wz z0(Cz>JpU3-i)UbhTYz`TwoZCe^Xnv?DZ5N=@4XZSMnf9iJagy#TBbfQeK~j8hw1}X zf7=wlyWZoN+5kKR3;%~kt#Fy0r`K`AadWJ{CiLsI$A4%TnP*6HBrGsC12wVlo|_OJ z6sQ*9C!v5s)s=%l2GITZT30VO??A=w4CP-!RgwQ=gP1+={qG9IP=|4%ScANK!k1kM zW=@Ra)v-FMBJi3fQqJyk}ou zpvP+uafg-V;%w?lnF-iL_D87#73NLy?vv3U6fshFOX!DfUM_E!>Jb63q;agcwC zK{tTeEscVpzYnD-X*2-NaoOI`RSk`X4Z^LeO@*ZZZT%d3cr#h<+v+&%C4Z$D^6faW z6pux^!Sm~QO7O)W^52mQ79C>A(%LQ_A?}Ke4U|D7IZ6j|>FO^zi@@^caW>i@ zHrvvY*;qq8 z_nTMCvFI5&_236o8qlWF(tLLD; zF~`v~Z}Iy$My+IRbG(!1vSWAQ35>)Mff|mKb`6fErJ@>$JrXj;UF^U!#;DlK!ay`H z2fr!OZDGrtr*4jyOH7OblNw4cN2MD+dVj)j!?wdod`sgWeVoKZAKeFh`*6N7woN(F z3MrRhge+zh`E2%Qp|m!4jmY1CjA-xp9E<(=przG#EFwv}4S;J>zvyPV~`@i$YsN2^aTGHOhL1w{_`&s%X;yz~2#}xIYKRgaQ0ks9DA- zBT;j|CJodfj`z>&rPGOPsQK|+N_GOS$BkAur!LJf^I)|H0bF?miME`Yvd2f{RA66p zPpXkypr7mqnOqV*%EtbqWXhBkr4dwsl<)k6{=GeOb7I%l`mLOvC9huOyfd;HU~R$R z%t$t96aICV)WgGEJ;i6gD; z=@}<4X#lEB&4nU;I>ZFx%pr8|{Q>28n|kdW?> zhNYK$zxn>-9L|}Uoq2Zlxv%@Wf7jg^D+ETtK!{1qBq<{!_>2dQ6P$3+_GSn@UVu-0 z{P(w6mcIU6hyr5#`1l7S$(Nf?hJQqB(#c7-+c!(qo}(8heCQ8 zV9(PwCh;DI`2LxZo34%7H<|Xdy4nt+kGQ<15Rfr&505e4ZxyRMM`+C7v0a>bS}%@h zuzNl!tN63_Efp9}`>i@K!2BgoRR<{0Upu@i+u^Z_|Kj6bpzXn&x*J8s-Z4vuGbhyS zL}+JUw0UX_ee*d@nFV7zE>wV^W~-?UeIu`lx2vHwR%U$T-wyi5Owb%DGfIXo+&Rca zcGFiqbfj=!&G`sVAU72h#LKcy94rznJ~>}=W2 z@qH%FpQie;xW;X0adDbpMn;R=rWK0^EC;N_CgK*oB|c5E;~m}VOk^B-g7@L&{Y2Ej z0EzT$>d7O2{(9AaAj0qB+HQV~&|c1E&Yg&wy9d0J`=2(`8;uQ9KtX6qD;^pCZPehW-+f$l|rVBOHtf5H}uM7*n?+<%5k-~ zt%InLH=X8cy(|}sjN~xgJ`E3dkRgqi4H$CUVMr7IebeRcbm_eGYml`XUn19hk0!h<#n;a3d>e(y~q|}Uir>a zJ*>l0m@i+NV#MRfJM5+hxF^r>917#p;nj^yWBbl#6?z*X@6u^7wfj>ad>&>S1T)pJ zLn;aG6Y3zlcc<~TTh)G_-dYkURdvgaBy^wdtil4Z4nzgEpP4nxY!~R1cnoSE#}`AV zVIm#{U#ukGHb?VpeQ@!n7~cDY)AsuH06{GN&!j-%$f<_(jFmHfDu(3y+cJ*4zbW

>x7?gy(9#i-$*Jau_Z3UushOJj zhwx=xMMQ2*#lFwvi&Ip5j(p$tLg9riA7tp&vCaR}>8rc$*W5bPe|6=3RH9Ow7mmeC zM6Gc#G=teiV8Bw@C)DE@7?DSYI0SMSC@s!oJC)6>UYCZ7v-*8n=zKfhu0eX&Q25K~ zQ#!A~QcEUkLzMZw`Qjl*??uYJuQog|sK+`!gi^Ubf9a~9^g$*Y^=7?8JlxTv|5*9r zZE{-@d)YWkTV2|WMoV*>re!0(Y-a`EiCDuemG~P39$aQ%>+XrmV%)35P{I4=9DjV9 z73ZOyckiuv6oI`-@OOg3k9Vk<2@UKH5I zEj714Wu---)zN0U8RsptZZo~jt%*Luq-Gt!`PU=Sw^N((pi(ZStrnf+VSC{#re>9^ zma};yaQ)aN`C}ap3Ij#Us|^T^UQ^$ks}*Jr2r*K(uuezz(8zXq-^KRWItGEUPCjjr z1qdTV2BJtk$E&?+CfB8r|I!Rt(S$5S_(=d|$~y4S-abJt4{rmTEVH+L;UIl5@`2}a zW4*wgWC%@Z>0Otf+U*q&Nb6{lsl2{-IX{>sf9nHF(=rD|<`F1?_Dh+G@g?bWXhN&4TS z82`xV@XL5D3(|Mf1%?E|fuluL%zACy?jyM2Gixu;EkT_~OogJxH`wp`S*E_P&8Y*T zP>775DWViV`!*i02 zcMBv&slHGI3`23QGgV%tV{VS?{zG5*-6~I=@4r;;(4fb7#Ub7Y4LF|}zYa{?p=@~~ z3%n(0Z+n?S$O2;y+wXUyaY)xO5dNMnkV)rA!Q+?n`FMmk=jpEt5E2~d-|t04{<(uPId;)^-i9iOuOKG5nPmr6dtFL))$cdbK@T=GhW#CbMWqvT%ga|@E9 zyA8U@*=zGdQ^qbuAI68(v(ngJwP}+==!F6x{)}3XAiy+W(!f5?02cXNfz7F2&hYt3 z*>m?E!ig$_L9v7s z+ulE-e&~qGxDO>#S=q-t(F_N2?|c{I_GBlJK9fEyr1-LK<3C#DA^WY)?QfY{F`k0P ziqY+LA!`8h(Cx*uJFM%`p&Jt(UjUd* z$a~-tcshy7iXN;^Jh!^^z+grlkfW1@D;;hdJ(|JIBYrywguV zKiUNR2G==;np~8gGGBx$!vA(no}a9VrIyaQ^P`yS>wTouy+}+0m`V;Nn#vq~QrdCv z0~H&nWeKbhtuC5_bIzx~Pw$wLg#QD*dcp%1YZ6HV!VvD;FHZH*faQ-UubriAtM!i7 z)9BA!VA+%dCYb#2e7G`RWMz>pt#b4WaC#WnJoO_BKm~lMn5K;<>RWzD-!Ic-|xl zYRmNm>D0D_<>@XZMrOTi^uP@_0HAPB!_CIY^Cn*K;TF~Bz^?&}U7hpNPYoZF&~@lu zk@usqgy)1fr-J-J1J!9-^}SLZ#`eASSbOB!ZnZ69rC zR(};2rHm%^#uE|M3nmb^`ho?$K%+Y4VDG_w;+}OR@l)Md2s%*-BW5uZRNq38TI~;KxT&>;h>AsnM4t8J$}(8Aa2SJd2G&9 zdY};`fF6G}VV=aU1#zi#!5k59ExjM6g9;9>?dE?9R!v0C;roa$F9RpMU)f^|Zoav_E8%0O-AGN3ebsgKbnwao zhQe3~<3DV4PDDH`jDz8tfe0q_0Y?NYXK$vT*zSr=AbumZjU^l}hLQY|*`#&JfM8tj zQ!l#u7&jpYR>FoV1w;ZvmBDR@%Na2{gik$?82{2Oi%>0>Zw#c(dkZ&;4IlyJTrGtA z1>Qi5uz1JTvy#1t?#xdz!ev9LJxJ7WMeQbx+}>mW*{B>`{|@j!^nCypZW1lqa|Xv~ z`$bE?hyDh3p`4zsvC5@B+trf-hrPrB+Spm(=6)c8`5$cgbL11T)mBM5F|-Z$I7KKsG8lB%;c2lIVF>nVgH7{I?KsCKlUh#a?yhcdDB*1eSF#EJi& z4mhQgl7HhmLmo0s3GDV~zXTR)C9u%%0+*(=dY%hKQ7a^&VZc`yADUm3F{pM(G^r;Y z=j8kr5(x?_4$!1~K6-uyyue)ixJlxli2fb_T6a4Jq;kB$I6XI*1DQECYJENKR;+#U z5ni!Bno-`K!RI8k-%h;$VskrZTe`@avYy;*4@+GCQG78;+9?kEHIQbvUn-N;4!kXb z{8vz$CJMuCT9{k}cJ~*UYC2!3hNtQ}kBI&U5{~=2hZ!#vWI-4FXXdS=14!Gj7YChu zs+u?UYr-f>sClR-G7!z_8$9gLSnh1+{B2i8i+U@&{06y)e+^-vvk{1pY`Q!>-POo5vFtIvir{i*#%tEJ{DqJ}%CnfR191Wfr zk%)1JxSnnq3Gx3x&px#kM`3lG#|#VW!X{!OX)yZ(7*MGKK+8_vko z*a_kuo&ziR`ln7}VtMb-f&0G;8}O{g%w^UWY#|}Zw#+VP^5>0v-nJH5dKiAEsn3;d zp~jtar)nBCZ!zxpf&>Z3I6Q@2=b07BNMIW~Rkb~#36)|R1uiX(GSJ1sS2Z$ZL}-Ml zQAMf$K>m!>XpT~&F(je6B4BgEqTb$Sbg(0gscs+B?DtjS4Je@^Uc39HKW#s@XEIvv zsD8z5vQ^CjtZvZ(&-QMhxDow{wLJ+0penMQ8dZOJaOwl(PI7|%M>)@e@HQ>4A4-SD&*?N0ezZmXQ-%fSOXcjutsYE7b ztbhXiFFt44FeWs1_<$7IJ!B>IqJFHU3gzy2Y8Pb)T!7EHp^Mr}pAo~p1t-3ebpQfVe;*}tF>nKyU{ z%lc~nCfZ7#nhisM6a|JcY?7F~a#5M>juJ>1JoJ+~k#aXL ztv+h77BW&~m)vB45w>BiByO=tdmEc&au|96dO29l*5tca*qhiRtw`(LuXF;`M9B%_ z`NeJteJ)dbe2nlx(tQ#Wzv^uBW{WpUGOJndYrlHm3?-NIa%c5R5C>eOx`1xbXOflR zbG)zA`0poOXD@zAr%_o%h1Jz=?uEJMGo?BbMbxG$3Qgjn(~O)*^F`HLiV_}Est`;$ z&9Dk0-3uP}odq<}{CaATQ=HWM#zyJ@o1m~CC7SYl+BsjEW#O85_ zpf~%oC5Ximlhw0e>>S7LFXvK|agSJjd|cDx7eelqE%jOTfB(*@Cf1YIT!qW)OvK;T z`(2fVJ5|Kqfg}jV9eekn>a5F<7jk>_(aMv@sZZ@s}h;9)vTA0VKc`CorKE9MIl5aRaYY?=r{>|>u`1*W>Qq+48|8HdSXJ9 zqz!BX0Sd1XVN1MS$;Vj`vd>?2J=)^du$eabbBoNigAn5{n2Cjf{X#YcFH`wV!$VUM zL^@yAl@tPRy3eF7)cMBzL9LI^*jxFZ6?YoM80SV5 zd7+wTM>>K}+xSQsCCK?WLGtkYrYu$1)zeO`koA{CfcKN)a~kl=*aozD)s_Q8HsI=E z7kgPDob(sni8fXcI(&_P+skkTytT)%fgHFeK*Rs}C?447A4vrQOhxWRB<`DEpeP8dC@ZcTB-qBQYQl2G)vlWxZEf|rX>-~A!Za4@>4<0GjT z*)Os@f(FO9w8P>RKZQ9_qn+1gpJu-9=JB^EpW@Z6uIPLaEvA2?aQeK{z>B`VQGK_8 zEBZdrj1;azLc zk%!Iuxc$^UK6+06dAS&txUq2Kv4W=pZQ{%2v-o#gOwFD47E8JvA~u1!?UZco>>Cf) zb%-wb)aK9O%ue2#Lt5$oDQiRR+XWCCzBccGhW3Af>3{4$U=*c2OJ(3Ll z(!cO~;xbL+%Imv9BLpKjq{^h}g7akJg6VO9@*gbLElyyF^n6kVfD4m*0Ucq_NHOp6MG{?_*pEC}R%wy4!wC5UhldGDlqUQ*6?V_f1a6 zYESO#taFW3NLplIY@0ZG3rA;nJ-D)qz1}>Suw(c5linK$SI9>&gM*8rulhIY$%4P^ z;p#o=%|hn(QsCGW9P0-8>M*+lBajz%?|-1z)uwd-OoIkn62^#Z8TnmbkAsW*H%n=Y z-o*w^zy!33DZ5zTj+XjjB0kbFU?yVcL)QiMa&DcpV`l6&NNMk&B3hd!>fU@_T;OF6 zjCN*Ki^zmeea>4RJ6gu<{LrmhG_~JerO(k^^nEEljo`Z_&z8JO-|Oj}!j>zWL3ge37N+h8akwNzPI-CtfOY zyY|QT+AuHu+i8SJ^~$hs`O;CPqd0Fl!ejNA|4rSxKG#`Ha>!(`r@6zuJPm);qmm!~ z!cUItYR=(h?>W9pGL`zI14wgRY%o1P1ttZ9;1t9h`O7@Az&Ni0VA^Z6BK=vY3}5pu ztvE7abHJU^5?S1_@JMk#oLWdcRU|b_AhFNqM>ac~qXl0GM0U!3ceDSpzG>_Xgv5mK z2-Ery>G2$vsNpy^vTo8!{`{D-;}m@)W2rm0<-OhoC6F^Vtrpt*%}@trw17!H4O%StUGxdlMMP=2p8i`Tzxi4F-Bgrx9=!G< z2AYaBd32O_0n~wg);FA#wg6peILbYq?3idnp(UMPtA$9(LbFBQ^J85O%jIte0O(V` zyOT2?dHUv2)lhjGC_4$fhBaH~-A_%e+FG?z*cHwO8)47*Rzc{3AY4?R^xlm{_1kEm z%FaCg`DpP12!sSgy&Kq7RX_5MwcDFRm6BDOLKvm_k9r}_7%9l!{HLq-gci+yFf#F< zQ_tnG&-0X=Yu#6!=0FA6Cf}S@-yCm<_qTP5b&CUa+Md09 z3q)>syX4dQZwxQm+ttAut-aas8pxggs7C!%T#TGQ0}V22@a%P5a_#Mb zR|6W0a=0FI7@zE$vv+PHQq>-tfmN-k!wL&pp#2ZNq>RWRzlz?*b)wW2E8F^CH8(X#( zS(T?;`y)#q-iM4UoP2ov$(k`nTmzE3nc&=e9__^Qv0#K8Cy64!;)!=A!V@g4d>KA8 zQ-u6m;EyvU$z z$?=8kn&cLmK^Q`0Zbb9pB{B@J_o|BJjK^|=4*`GDd}*2CZ&M=`1)9$N(k`(QVo@QWQt+D*z)b*J+?BABBJnRC;8iFn@H}YY2jF766Vm2d>?6@H8|0@ zNnhV4wYpwZ9u=S$OTzaDjEDpKL<0B@p`=Wyd<5`w)z)t7vw2LC0!cnpn#7QvyhM;k z9c0tR)o8NkiSX!n_~K>V2**AEZ0D+Tq)q!K&e1$v0?)3tY3?fqU8NMG`mkRtKE|^R zupkPcw$AX5Tfu3l#VONXV6!-zogGI3nUnc+pULaf|KB5xH zxN|U~Ir2F9L<1i`+Jft!(<(`N!aBjO_6*DV9IyATBx+_p z4WEA{OwlAqPLdRjUob*27)9>DTb>BdH*@0?qHd?q1Fc6dW69du^E@CAx!XNC8_SN{ zU-OB3Y?P^=B-%4}v@h&W2W4b;KQ7=BxcC!UKe0dX1Lu8jWUH6{L^!_bmeoO;{(>); zfRE12ICuyKpP|;|fyb=P{e;5$)I#FlnoT$~*tiP(TRSt!+c~n#9AY36GRjg~KBZb_ z^@jMf$Bc})j~Z-NbR&U3+>{e;YZzPf3Jyz0qc{ zQqf&CqFQB=y02&V@f66hKF+^B&KUTYjz%pOsCTgEwZN**+w3$(FEOalX;ibkcy6{YD|WIeIO|iMuw*pL0hC zE`dH=m&h5Ip`7hj;sEpDoNB7p>qeQ#>2Ympr3|z~-##D7Xh~Ed6AXj|rb_QIwijt# zddpLwpioJkhpPYb=mn^0IXNdM{?FEPJ_NE(M{*v>j}-@!VD0c-X;kd5qAg7a3}^S_wgVJtQU^Ek6%TmA*=+jxBpJ4erpX z#u3*KII{sk_96tup3DE~wm7>$mqy5ei~ExL)?6-o|63F~PQ_Z6vl6Bi7t5bB^u(b+ z>OUOCx}4@ZS&FS6TSrZUHe>UGaD8#vNJ565s>X#Pq*3TA?avnpLZ6OyoB3xW5^K4ojc0|KrPh$(@d-VAGI= zaaxnjr#M)f5VLrG_*ZXdrnyI$_=B0g8@)zw{N zm~;tf!;Et1mj#9jCyD4(5OeWia2iV-dClMS@1sn-FV0#_L@AJu9g#v5=t4#EMQkc9 zljuTUi4KFKLBZR(F{o|vHlmf(!S_3_ek2JoCGomrF!7J^;B)!liXE*l7W1g&_<^E0C>ljG2C~t62ff^SE^~Ene9jPSb zJ?GRnm$Em2A7&J_STsSxWa0Y9w(T#iG#!2W{)D2Zn(n-v9v`{Fc$~+bBz{QwkVpO} z4-!j#x(m{%pj!$C3czjDgwd2B=%uu97$k!$CfkKv8$`a~=R&;dgNnjhD(iCGE^o?$ zCgU6%Z{RAoGXfBHE)k<9V~JqhA3ABf!a3Cn8YnR{Sy({JqhfI7^%za`@o|+I=$e)t zUHoC1%*5S7QMw#K}_*2$Ik?|=JL-|M&hvWmS@TM{Z zH8K9ISL}8~Vz}E?p0PEOW4isRlS}l4ynvtm7scC(04<>b)_Z-p7+#Yiep`gf77bQx zMATTVcmcozp!QWy!}d-1Bw!pO%ypc9g;38dZn}pUj^@$mL;Ph8R11+qjh5nXJ!1x^ zc4!1{1L4GaRd+6HhDR!1JpJtD`w2;xos}4gYZ*zue=8Ct=VTqe6-C}uG-Oi7UGfr8 z44M3NKW}6bKkgTTt5Ji85-)*CZ9YFxmqlOK0Fr!D$N*a+{+me2{dxqKL}FFYgWVIiAj)vc65%S(<=UKS)qAafIZ-#K;5qqO@`-Ko>uBm0$UN zMXc6{Uf!FFjoa9Z$dj!CyDv~+Hms7OQ^*9!$<6jJHc*BvoC;S|NixW?LUTST#C90i zTbQ&~v}|dga$Xqip!ZWvMR%h;r?_YPW|UaWKJjitDGqN1D5LGQh(53tCDQY6qi30k zB>U)T;sT;NI*1)DVZ&t!bHT7nO?dK1*{ly%z zFYoa94-~2Wr1(#(DL${sC<+KlIFHUUw z+48wCLVj5QI$~N~yuB~tGu^;+nK(WFgLG=6&&IbWhi-~=Rm!-y=7K+8mTj6ZQOQue zeZ~KL59J$gc;iX!Ou}M3Q>pd2>uY-ldk06&Xiw?{@gCzii5c_-`yH^&OT8FA@$~lx z@P`_P%r8Wr1tozN26NQ=H8Bp8nc}?nX;dPiLf9rIg>LT5fsaC^DM145or?Gm)WrNm zqIjEe(OhQ&jP)%5ARe;gt94tw(r*sSETa7NN%jt3J~`l_$nYeV-;a?XRh}q=pA?>9 zft!)Eukxi3L|g1eQBZ2mQ}Kx^MAjks(jg%#){719&|mDNp?RkDHAo_{v=L{vCAooK zX~eBV^P8sk@_Z@4dD4^gSlHK^&(>pP%?>YXc!r%iOX{ zOWUhEyLON_&!32{ZY_X4n+JlQb9wj$t9U2I(8!=Ye+s@Z;1Jnj$ z_3B+Aig)Z|y46HaQ~K%Xqj_MTp7=W*KT<%0i8D2%-QM>M2c#(}vNkKwQ^VR<%|0&lJqx@7FGvzWh$aWj?D(Hn~) z&9_SGV{-4?9VW8!59kGK)Ae{KdyiCJ6ab2N(g+jaH|fg7+#YAU@vI;HMt?Z&X!+fO zmlxo%%zIf8i*?JhnmarA*29ERpRn1ZNm%jTX1LVBG3rh)|IMh-oV%T3ma_hN<=WHZ z*;Fi`ZN>+}KjuPj-_F@XZIqX7#h}`V;@#x$2eLe#w(O0qojeBht>{G9Ei-%G0J}An( z(<*Y27Uq^|p?c*vSq<2%%?=fDY%eT@T=2w1{3U;Vf)LVKDPat0gaU^p{_U{MKedLG zvKe0u5~4Hhl3bGrn0nuI(B8O=rAcLZN#g8!k=ukYItI@QRXuka0JLK31hiemnzDkC2& zOOQ(GcuOxNDGA^Q>Y09^W*O3OZ9QAddGrwPFG&QP*UpjT)X5=%-^)_3*Z8__<{s&S zKivTpS_B_zHf^8ecEU~F(`jJe;0BF30+>`pWnbu|Dc!h#&>r|qIy*p`7%>)8&|}kS za%Pe926{c#zJY)k<_`C9F8ba^JeTRtv+m4LeV*BK&QV0If`P;@4F<&vvjaR$Sk+iBIKHFCvkE$;{}H%?gLS6if&+pqP`cTln>Cc@XMoNQvg>wjQx+Dw(#CVKVi z^sNBy2c*7vJkTqS))RvH)y=!GV~&ztBZ_o#;zLfDrg~dQ%}$!>Q_|;v`{HqhU1f5V zBw3T#>zyXYq#atD=s`2JM(Q@RjWpH(--mqVZGLTB@^P2dxUn0P&vO+uS?bw`7SmVn zd>B`)(iC1La`%oUhTsuL34tOLg7BdHLeKs-BQ)fEpEPK_=t8e)UK2uIzw!OnECQlQ z{!aUn@$<(~fadq42hwtZDBM!9oeX3LHm=?vE;MwdTstKUIkVkKq*W)RVQ~CSx!!8n zmAwV?s(>oOvt$^;u$RVU!3^^OyGn4+OuV%s>c`5V8Ic96cojEit@UaQSS0{>b4po4 z9+J=Z=%6I!`zL8$f(H9+YPT`ivvaJfi(4Jv^l+?Pkg*fF^Zj)h;gY&@gqA_AeNmox zWXmiu09yDDRM<171X@ds|IQTh3s4?bQfU-fc8+9$@+KzU^mqUE^j#St4pHb3Ufq8n zrVI`yPdOBV_5{zIOYu~}R&5|hIj&%bbp#x#7yGU=$uaiZ3Uh3N?AF4?U11rDs?6jo z1N$M~v$N31)1P4GI$sc zNV;f3VnF9S1#Kr!MAm6DMEfkkImDKzj81rVB6*^a>t{;l@ z!bJjjX#vEq2ppz+-%*DO^#aof)^w@J(!G$UF^s+`#J_5c?|GbS&HsUv)$cX1O^DHx z1vQ6kRM2q_p>k@|3Wd;%ZZRWe&0xyYj?l_U@EZ%YjNygTJ>E3j(E(&$Le zv!n@>a3XkO1vkL~UdIwA=j9?YY*XV>ln}vpSID0}G^2*ki5hC# zpu`W9uv!0w{A2w_KD4?Wq)iV4v$Ip5g|<$C=kuFd7iC<8>2q@KN+)brur`w<$)}hK zN!JxhlTM^U0Is4KURlBWRcD*zV0@I_T~73yqUe)P)sNwV5Ng4`r^63bvVHH6rETJ!DU9)7iB0`3Nb||&^!Z4qtXgpJOAxG{${0Xo6 zV`Be+Pr)W3+ScgQhYcFm>H47z`TJe2wUJwpzcsjQe)R*po6uOE*Wr8)BvlTL&>1G< zb^5uswax2RnX*=!4&NIKS}d3Jb`X!d&;rT>4Op`#-IR20R&>D-+)s=)%XouCOXwe9 z0JwoZ@AA}{b0CQ(xIn9Ajybj-ha7zTTA}$qNO}W$BHp0o46*1OVAIb}?6QUZlflmT zMZB#XJ2;~_Tp>9XvV**OT{sHU)Cxui<)9tstKO7Q)_;!{vc!=`YV}$q-C3o~EKK@M z8l{<#b83(fh--66zmFywnirXK_wUD*gE1bJVhV#3jmN{K7g*tgULtmk_TX3vzXz6S zB6oDLd^Themvj4J|h>Ym$U-5V|O!l196c@s4ea6s>T=g{b+({12GM zog{0+(?qGQ{(<)4e22_3AO6Ya1iHC{bLB>!-i~+V{QQ1V1EjXowC>Jg@adLo~K90_Nb265Q&uKc7vRhPIUsp$>4v?Ux&U(?28tZXezoz5WlFj;^P_aLE+I=8#srmG^5NMKL=|9bq{B z{3tp$9Kah_TEe~fY)!tw`WLgg?cK>h{$v>nzn6M3Sz5B zgLt|IIaOeq^`dNQI?^H*`hejVaGBo+MC$gMh}56P7)xM`(_hIw0^4iOyrF@bHWK8b z45D7xZaG~6e&F9B;hQ;4z0~&0WA7kK!fEv6dGSIAARtKII$2+l= z?TGJH$G26nF5Onx{`Z~Mx|&H`n2U5N5P9=K=~t>|fDW)P_I+8TWkB>j+6tVqKKgmp zdJRbZ*=z2ZbH}XSX;#K*Xpkj2A#FZNtj-##Xd$2%7;m=1Vep_O+nx#$M+ex)aS+72 ziyfWzKkgHH7w4TK7wUY}PD#wB1x z$eBdU&wh>|_6>s}&|&OpWcItqlJk6YOO?is-y^8ql?r^fDiz)t#ec>(BCB-k!n zmV=+zMKb*)(aH~L#PYPpL^y34}XZfK|teaEF2s>ps zbC4e=5JbcuZ$*=rT5O{=`nsvOy@nJb4Pp!agWCp4l7COlIZ!*wQl@Ip-fdUx-3>cD zB$*cT%}FT6c`q(^zB;d%`5r>%$RN_g!Q`R?cJY4lXMGhxs~eX1{QI)!gQ~J)rs%EF z+ZLSTS>Tal5TK1q$QN1RBG)tFaS_B?c$HoeEc{!XEPV6(dd9b=HW}9qX=04)- z^)>r>tZCeynp2b(X1^;}NbQ@rv0MUEeKXdpLyP-@@g)6bc_6L>Cs_*WF=}5x5`dxRI$OG9pnNL89Ap0< z$nyM~I)d=~|P5@_|THw`?X^le21}g>mKAoDv1G3en`j7j|jg`X){xn(l zU?OtHtCstPqm3uxbus8xX+Q8D2yDp9_ocOg@9s(`qeHRV{5|Qn>$F!-R&v>8N2YWWN zmmQ)UACdehjc^erjg?ji|B}__e5R5GHOw#XF6CwtaN;51d(3ryZm+u9EVvb~Kz)(F z<1PUe@9yqr^BA0K+=**o_@vrzL;EhD=vUiK0Mj4UVDj=I1= zGVc2PubcS?Hd4b}qu;D(G)@_ov;K`)UH*;zTEvaA`RJ-_ZLWDmd`4$3NEd3jKY74= zvL|n0N$s@MhrY409+67nD(c%u{uUj;ejI+hVj~capt<|0WMh`b<1&m5le!ka*4u2R zA*TO$W!i2US$E%)FI3W#@pEuY@`b2xg1$(V)N7YT*~#Zw_JcwT-OqH_x+%4BSYGQX zLWQ22sOHj?ymx?uinbLfyB!^=8OB1a)RR0&Aw(OYQ(J0^$oPp>IOgvlE)y!v6Gm5$`IR<@>=2y@)(5AKN7x_a^lwHK47B z>$X5!gFQ6Tdz+m5!p2lhUUx%`&SD zZsZW`9j+!;XSUSxqG80g#z49gzQJ(@ptZ6*B9Rs#y8h6Gi<=+O>9r%LO=NjCs@;S65d|LL8`s`Oj(M< z#3?DNDAVZPFg5siccQzydXZhl&=x1zYA zFJ84Yt9O4RqeGM=I}^=9?CwE86S2e;#B#7BMECF?=%#!I0x6Su-4QHJj8}kd1s07@ zLl<>^I>JmNY)z~`+DQKoR1wWW@a1$5_HKTQ8~~?aKKN>WT8$twP;R`|nRCJfysDHe z1vXjy+EIMIhNJKDl$&(1#<0s#ZXP^-M1$-HM6s5ZWw?rdq5!REP0erY*d0z)hS}^e zW$Jt%mZAYG6a7&eahbk8^c=imNEC6Rv0s&}T40{_k4&iTAgxOCa;4DdIL&HE;IpRE zr96LF#%`XIH^V_78%u#*o01J|br3^v2v5p&_C0^{4mlIlIB#b>QK^548tg1hGWxAj zm?xf7OHIDSjX>E+n_vVY1wyBI*u5#XVe$)K_UdC61s4-*>m;=y07ndJ?R)@pz)DZ! za7ds9khys4&)lo^F!8s$O_Zxa)`33U(r!tG3-8Px6&%S%TYtsMB+?QaWbMQj4U~0{L;gQz| zseM${)>T_x%hJS>uu1trO=tg$*a9IcW-wo*HACkUgR-<>r_NKKmV<67{~g%DgiO7v?hoJ5dJ|(>UuU%6B(WHTFcSblXB$G zEI+yj%z~SN*09{~U~}xe5jpY9_wTxjy1iQ$3-{=#bC;$*;j;Y5xTQAG8$oV}pi8C0 z0jtLA=`s`c8*aOc04ye}r`N=4MhEf+m1bu;<)I3wfzWRo;XJo&A- za5D*M2>s8rG`6Z3CcYH5T+JHjEiUhQbQGiU%8!&F8J!)#Lqe@8O@rhKrtfokgkTI% z2#Gycyl?Wd9JL>v)F1#vxZx&Z6@l*%Rr0kE(3pte0N(ISw=%E;?haUbFggKToqA8A zf807~^Z_-5_^cRy7PECKb$_~@H7Tdd$-$WRwo?`27;=Pc0b7?vCCSxcOIf8kxt?yk zJ@}h-BN0FP9|*x*`a~>p`{p^O`t2!JK52wY6Ap zEbAz?2zb2ha9r38{J2gIABx({$36_egGXeOM5GoS!gX!ZJPPi)^nXznS?79T6uc6? z8J)CKbc^+reB{c{auT5!W~HbaA41h<1d zMFi5t>eJAXV$1~3^FpFo&>As{x^Vl~h|3^QA*wDUz?7S~r>)X3M4Y!K@nroY*x}@V ItN(u!05d{CO#lD@ -- Gitee From ae8fc872ec4dbfbca62e7d3f4c083f2e6eece659 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 07:19:39 +0000 Subject: [PATCH 56/59] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20AC?= =?UTF-8?q?L=5FTensorFlow/contrib/cv/SimpleHumanPose=5FID0956=5Ffor=5FACL/?= =?UTF-8?q?src/assets/2.jpg?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/assets/2.jpg | Bin 223163 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/2.jpg diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/2.jpg b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/2.jpg deleted file mode 100644 index 628c9fac1ba6cfe509141c7b83f6845a977da2ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223163 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 -- Gitee From 8f0bf1e00472068dd26021160a7e24d2873e1ee6 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 07:59:26 +0000 Subject: [PATCH 57/59] update README.md. --- .../SimpleHumanPose_ID0956_for_ACL/README.md | 12 ++++++++++-- .../src/assets/acl_result.png | Bin 45320 -> 34500 bytes 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md index 83ba2f28c..5f599a3bb 100644 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md @@ -90,10 +90,18 @@ image.tofile(bin_path) count += 1 ``` ### 推理测试 -使用msame推理工具,参考如下命令,发起推理测试: +使用msame推理工具,参考如下命令,发起推理测试。我们只使用了测试集中的部分数据进行推理(即如下命令中的data文件夹只包含360个bin文件)。 ``` ./msame --model "/home/HwHiAiUser/AscendProjects/shp/shp_acc.om" --input "/home/HwHiAiUser/AscendProjects/shp/data" --output "/home/HwHiAiUser/AscendProjects/shp/out/" --outfmt TXT ``` 推理结果如下图所示: -![输入图片说明](src/assets/acl_result.png) \ No newline at end of file +![输入图片说明](src/assets/acl_result.png) + +然后使用获取到的推理结果计算精度,具体代码在main/pb_inference.py中。 + +### 推理精度 +|Methods|AP|AP.5 |AP.75|AP(M)|AP(L)|AR|AR.5|AR.75|AR(M|AR(L)| +|--|--|--|--|--|--|--|--|--|--|--| +|原论文|70.2|89.0|77.6|66.8|76.9|76.0|93.1|82.7|71.7|82.3| +|离线推理|64.0|86.4|71.9|60.8|71.1|72.5|91.6|79.5|67.5|79.4| \ No newline at end of file diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/acl_result.png b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/src/assets/acl_result.png index 0bbda1a29786ff62806ada2d041e7638516cd3b9..8c66f9d4071961314a6262cf7b39b6f03d3f30a5 100644 GIT binary patch literal 34500 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 literal 45320 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

E9od(;Gq1SLt6P_|gy#dtnlnDy%DH>| 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 -- Gitee From b2c5fca192579a8fb082f556d8829c698402a01c Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 11:29:12 +0000 Subject: [PATCH 58/59] update ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md. --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md index 5f599a3bb..9e2605cc9 100644 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md @@ -43,7 +43,7 @@ SimpleHumanPose模型主要针对人体姿态估计和姿态追踪,提出一 | ├── pip-requirements.txt //配置文件,用于指定依赖包的包名及版本号 ``` ### ckpt转pb -在main/pb_frozen.py中,将模型和权重转化为pb,可以使用ModelArts启动pb固化代码,我们提供转换好的pb模型文件:[obs链接,提取码:000000](https://e-share.obs-website.cn-north-1.myhuaweicloud.com?token=0xQYRip2sq0KE/psA/59+BRZKLxwglylSGDkKq9CCOl7T4Nsf80zWftId0Zc+TqRVTMTtR1TiXIDRq+a4W6N5HfkghM5sX1GTCI1T1xyYOLeq6YjcV1RRAHr8/mo/0DjOirO77RhAeQ+32iuuaWzbZU0UkcTvtIBWsYFzQgKOaDkaUUhmut8luIAdb97RhTwk9Xb9YwIvNF70BbD4MIemgJlzCgMIgg41X2PrRKyLa840RwBjNeM/3nRimUVLxPI2w1oFj08R7MPETcc9W5cEHlj8RxzJ2cgr/8F/OEBZQNqTq7fHSnWy2OqCxoD0Vj5QBLMztMGxadgGeuARd1G2Pb2+EXBf3N9mSTofqV6RowjgM5ETuhJuW2HCXEdZSJ6qPqtgwfLE4x6G12qkvA+cxG986L9lTGGrcugfTkTyPnLuSmz78pHBAAXBXiylok4cmRz3IM0BFkNk+C4CEKT30kmKceVYM33inGtR4kKvQk60UiGcRnjJVgDdPN0TtCiDE5Wq7MJ+dc10r8XMctCKVxJuHvt4vliJolTG4HqV9Q=) +在main/pb_frozen.py中,将模型和权重转化为pb,可以使用ModelArts启动pb固化代码,我们提供转换好的pb模型文件: [obs链接,提取码:000000](https://e-share.obs-website.cn-north-1.myhuaweicloud.com?token=0xQYRip2sq0KE/psA/59+BRZKLxwglylSGDkKq9CCOl7T4Nsf80zWftId0Zc+TqRVTMTtR1TiXIDRq+a4W6N5HfkghM5sX1GTCI1T1xyYOLeq6YjcV1RRAHr8/mo/0DjOirO77RhAeQ+32iuuaWzbZU0UkcTvtIBWsYFzQgKOaDkaUUhmut8luIAdb97RhTwk9Xb9YwIvNF70BbD4MIemgJlzCgMIgg41X2PrRKyLa840RwBjNeM/3nRimUVLxPI2w1oFj08R7MPETcc9W5cEHlj8RxzJ2cgr/8F/OEBZQNqTq7fHSnWy2OqCxoD0Vj5QBLMztMGxadgGeuARd1G2Pb2+EXBf3N9mSTofqV6RowjgM5ETuhJuW2HCXEdZSJ6qPqtgwfLE4x6G12qkvA+cxG986L9lTGGrcugfTkTyPnLuSmz78pHBAAXBXiylok4cmRz3IM0BFkNk+C4CEKT30kmKceVYM33inGtR4kKvQk60UiGcRnjJVgDdPN0TtCiDE5Wq7MJ+dc10r8XMctCKVxJuHvt4vliJolTG4HqV9Q=) pb_frozen.py主要代码如下: @@ -71,7 +71,7 @@ with tf.Session() as sess: ``` ### pb转om -使用ATC模型转换工具进行模型转换时可以参考如下指令,我们提供转换好的om模型文件:[obs链接,提取码:000000](https://e-share.obs-website.cn-north-1.myhuaweicloud.com?token=0xQYRip2sq0KE/psA/59+BRZKLxwglylSGDkKq9CCOl7T4Nsf80zWftId0Zc+TqRVTMTtR1TiXIDRq+a4W6N5HfkghM5sX1GTCI1T1xyYOLeq6YjcV1RRAHr8/mo/0DjOirO77RhAeQ+32iuuaWzbZU0UkcTvtIBWsYFzQgKOaDkaUUhmut8luIAdb97RhTwk9Xb9YwIvNF70BbD4MIemgJlzCgMIgg41X2PrRKyLa9sod8v7oOewaSzJFh6oPs0VltNRJ66ZKmZ3VwoUB6PPNZOjRT/vTBpMsioMbQkju8iNFs50rY2vHedwUvENXeC16JcpUGKHlsEjP4cp+2byr7TQmi0Rw6oBNj1AalqCEvvJumjhp+WLj32IT9Vl1Fz6d4aGLEPh2BiWxLO8ZvO3uXwjccj5g3jsr+r5Fwi5hE/gXSfjIiF82n1PDh2wVggyKogS+us60Qks6Gw9fGuAKSOURXV875yiYCFqnVfDcJEUB3sSx1WrcTDOMA+mE6aDAujlInC8aRgjP3XMTwkennHqtT9ZF6WRJ7BLx0cJ18=) +使用ATC模型转换工具进行模型转换时可以参考如下指令,我们提供转换好的om模型文件: [obs链接,提取码:000000](https://e-share.obs-website.cn-north-1.myhuaweicloud.com?token=0xQYRip2sq0KE/psA/59+BRZKLxwglylSGDkKq9CCOl7T4Nsf80zWftId0Zc+TqRVTMTtR1TiXIDRq+a4W6N5HfkghM5sX1GTCI1T1xyYOLeq6YjcV1RRAHr8/mo/0DjOirO77RhAeQ+32iuuaWzbZU0UkcTvtIBWsYFzQgKOaDkaUUhmut8luIAdb97RhTwk9Xb9YwIvNF70BbD4MIemgJlzCgMIgg41X2PrRKyLa9sod8v7oOewaSzJFh6oPs0VltNRJ66ZKmZ3VwoUB6PPNZOjRT/vTBpMsioMbQkju8iNFs50rY2vHedwUvENXeC16JcpUGKHlsEjP4cp+2byr7TQmi0Rw6oBNj1AalqCEvvJumjhp+WLj32IT9Vl1Fz6d4aGLEPh2BiWxLO8ZvO3uXwjccj5g3jsr+r5Fwi5hE/gXSfjIiF82n1PDh2wVggyKogS+us60Qks6Gw9fGuAKSOURXV875yiYCFqnVfDcJEUB3sSx1WrcTDOMA+mE6aDAujlInC8aRgjP3XMTwkennHqtT9ZF6WRJ7BLx0cJ18=) ``` atc --model=/home/HwHiAiUser/AscendProjects/pb_model/frozen_model.pb --framework=3 --output=/home/HwHiAiUser/AscendProjects/shp/shp_acc --soc_version=Ascend310 --input_shape="Placeholder:1,256,192,3" --log=info --out_nodes="out/BiasAdd:0" --debug_dir=/home/module/out/debug_info -- Gitee From 75d231b5cff0c4acc09660a7973f5abc360d3784 Mon Sep 17 00:00:00 2001 From: maoao <1846577244@qq.com> Date: Tue, 24 May 2022 12:26:37 +0000 Subject: [PATCH 59/59] update ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md. --- .../contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md index 9e2605cc9..106529b86 100644 --- a/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md +++ b/ACL_TensorFlow/contrib/cv/SimpleHumanPose_ID0956_for_ACL/README.md @@ -103,5 +103,5 @@ count += 1 ### 推理精度 |Methods|AP|AP.5 |AP.75|AP(M)|AP(L)|AR|AR.5|AR.75|AR(M|AR(L)| |--|--|--|--|--|--|--|--|--|--|--| -|原论文|70.2|89.0|77.6|66.8|76.9|76.0|93.1|82.7|71.7|82.3| +|原论文|70.3|88.8|77.8|67.0|76.7|76.1|93.0|82.9|71.8|82.3| |离线推理|64.0|86.4|71.9|60.8|71.1|72.5|91.6|79.5|67.5|79.4| \ No newline at end of file -- Gitee