from __future__ import absolute_import from __future__ import division from __future__ import print_function import pycocotools.coco as coco from pycocotools.cocoeval import COCOeval import numpy as np import json import os import torch.utils.data as data class FACEHP(data.Dataset): num_classes = 1 num_joints = 5 default_resolution = [800, 800] mean = np.array([0.40789654, 0.44719302, 0.47026115], dtype=np.float32).reshape(1, 1, 3) std = np.array([0.28863828, 0.27408164, 0.27809835], dtype=np.float32).reshape(1, 1, 3) flip_idx = [[0, 1], [3, 4]] # 翻转的关键点在关键点矩阵中的索引 def __init__(self, opt, split): super(FACEHP, self).__init__() self.edges = [[0, 1], [0, 2], [1, 3], [2, 4], [4, 6], [3, 5], [5, 6], [5, 7], [7, 9], [6, 8], [8, 10], [6, 12], [5, 11], [11, 12], [12, 14], [14, 16], [11, 13], [13, 15]] self.acc_idxs = [1, 2, 3, 4] self.data_dir = opt.data_dir self.img_dir = os.path.join(self.data_dir, 'images/train') # 训练图片所在地址 _ann_name = {'train': 'train', 'val': 'val'} if split == 'val': self.annot_path = os.path.join( self.data_dir, 'labels', '{}_face.json').format(_ann_name[split]) else: self.annot_path = os.path.join( self.data_dir, 'labels', '{}_face.json').format(_ann_name[split]) self.max_objs = 32 self._data_rng = np.random.RandomState(123) self._eig_val = np.array([0.2141788, 0.01817699, 0.00341571], dtype=np.float32) self._eig_vec = np.array([ [-0.58752847, -0.69563484, 0.41340352], [-0.5832747, 0.00994535, -0.81221408], [-0.56089297, 0.71832671, 0.41158938] ], dtype=np.float32) self.split = split self.opt = opt print('==> initializing centerface key point {} data.'.format(split)) self.coco = coco.COCO(self.annot_path) image_ids = self.coco.getImgIds() if split == 'train': self.images = [] for img_id in image_ids: idxs = self.coco.getAnnIds(imgIds=[img_id]) if len(idxs) > 0: self.images.append(img_id) else: self.images = image_ids self.num_samples = len(self.images) print('Loaded {} {} samples'.format(split, self.num_samples)) def _to_float(self, x): return float("{:.2f}".format(x)) def convert_eval_format(self, all_bboxes): # import pdb; pdb.set_trace() detections = [] for image_id in all_bboxes: for cls_ind in all_bboxes[image_id]: category_id = 1 for dets in all_bboxes[image_id][cls_ind]: bbox = dets[:4] bbox[2] -= bbox[0] bbox[3] -= bbox[1] score = dets[4] bbox_out = list(map(self._to_float, bbox)) keypoints = np.concatenate([ np.array(dets[5:39], dtype=np.float32).reshape(-1, 2), np.ones((17, 1), dtype=np.float32)], axis=1).reshape(51).tolist() keypoints = list(map(self._to_float, keypoints)) detection = { "image_id": int(image_id), "category_id": int(category_id), "bbox": bbox_out, "score": float("{:.2f}".format(score)), "keypoints": keypoints } detections.append(detection) return detections def __len__(self): return self.num_samples def save_results(self, results, save_dir): json.dump(self.convert_eval_format(results), open('{}/results.json'.format(save_dir), 'w')) def run_eval(self, results, save_dir): # result_json = os.path.join(opt.save_dir, "results.json") # detections = convert_eval_format(all_boxes) # json.dump(detections, open(result_json, "w")) self.save_results(results, save_dir) coco_dets = self.coco.loadRes('{}/results.json'.format(save_dir)) coco_eval = COCOeval(self.coco, coco_dets, "keypoints") coco_eval.evaluate() coco_eval.accumulate() coco_eval.summarize() coco_eval = COCOeval(self.coco, coco_dets, "bbox") coco_eval.evaluate() coco_eval.accumulate() coco_eval.summarize()