Ejemplo n.º 1
0
    def eval_frame(self, frame_id, trk_tlwhs, trk_ids, rtn_events=False):
        # results
        trk_tlwhs = np.copy(trk_tlwhs)
        trk_ids = np.copy(trk_ids)

        # gts
        gt_objs = self.gt_frame_dict.get(frame_id, [])
        gt_tlwhs, gt_ids = unzip_objs(gt_objs)[:2]

        # ignore boxes
        ignore_objs = self.gt_ignore_frame_dict.get(frame_id, [])
        ignore_tlwhs = unzip_objs(ignore_objs)[0]

        # remove ignored results
        keep = np.ones(len(trk_tlwhs), dtype=bool)
        iou_distance = mm.distances.iou_matrix(ignore_tlwhs,
                                               trk_tlwhs,
                                               max_iou=0.5)
        if len(iou_distance) > 0:
            match_is, match_js = mm.lap.linear_sum_assignment(iou_distance)
            match_is, match_js = map(lambda a: np.asarray(a, dtype=int),
                                     [match_is, match_js])
            match_ious = iou_distance[match_is, match_js]

            match_js = np.asarray(match_js, dtype=int)
            match_js = match_js[np.logical_not(np.isnan(match_ious))]
            keep[match_js] = False
            trk_tlwhs = trk_tlwhs[keep]
            trk_ids = trk_ids[keep]
        #match_is, match_js = mm.lap.linear_sum_assignment(iou_distance)
        #match_is, match_js = map(lambda a: np.asarray(a, dtype=int), [match_is, match_js])
        #match_ious = iou_distance[match_is, match_js]

        #match_js = np.asarray(match_js, dtype=int)
        #match_js = match_js[np.logical_not(np.isnan(match_ious))]
        #keep[match_js] = False
        #trk_tlwhs = trk_tlwhs[keep]
        #trk_ids = trk_ids[keep]

        # get distance matrix
        iou_distance = mm.distances.iou_matrix(gt_tlwhs,
                                               trk_tlwhs,
                                               max_iou=0.5)

        # acc
        if self.return_fn and self.return_fp:
            _, oids_masked, hids_masked = self.acc.update(
                gt_ids, trk_ids, iou_distance)
        else:
            self.acc.update(gt_ids, trk_ids, iou_distance)

        if rtn_events and iou_distance.size > 0 and hasattr(
                self.acc, 'last_mot_events'):
            events = self.acc.last_mot_events  # only supported by https://github.com/longcw/py-motmetrics
        else:
            events = None

        if self.return_fn and self.return_fp:
            return events, oids_masked, hids_masked
        return events
Ejemplo n.º 2
0
    def eval_file(self, filename):
        self.reset_accumulator()

        result_frame_dict = read_results(filename, self.data_type, is_gt=False)
        #frames = sorted(list(set(self.gt_frame_dict.keys()) | set(result_frame_dict.keys())))
        frames = sorted(list(set(result_frame_dict.keys())))
        for frame_id in frames:
            trk_objs = result_frame_dict.get(frame_id, [])
            trk_tlwhs, trk_ids = unzip_objs(trk_objs)[:2]
            self.eval_frame(frame_id, trk_tlwhs, trk_ids, rtn_events=False)

        return self.acc
Ejemplo n.º 3
0
    def eval_file(self, filename):
        self.reset_accumulator()
        if self.return_fn and self.return_fp:
            fns = {}
            fps = {}
            matched = {}
            fp_confs = {}
        result_frame_dict = read_results(filename, self.data_type, is_gt=False)
        frames = sorted(
            list(
                set(self.gt_frame_dict.keys())
                | set(result_frame_dict.keys())))
        for frame_id in frames:
            trk_objs = result_frame_dict.get(frame_id, [])
            trk_tlwhs, trk_ids, trk_confs = unzip_objs(trk_objs)
            trk_confs = np.array(trk_confs)
            if self.return_fn and self.return_fp:
                _, oids_masked, hids_masked = self.eval_frame(frame_id,
                                                              trk_tlwhs,
                                                              trk_ids,
                                                              rtn_events=False)
                gt_objs = self.gt_frame_dict.get(frame_id, [])
                gt_tlwhs, gt_ids = unzip_objs(gt_objs)[:2]

                # These are the matched boxes
                matched[frame_id] = {}
                matched[frame_id]['gt'] = gt_tlwhs[oids_masked]
                matched[frame_id]['trk'] = trk_tlwhs[hids_masked]
                matched[frame_id]['trk_confs'] = trk_confs[hids_masked]
                # FN FP
                fns[frame_id] = gt_tlwhs[~oids_masked]
                fps[frame_id] = trk_tlwhs[~hids_masked]
                fp_confs[frame_id] = trk_confs[~hids_masked]
            else:
                self.eval_frame(frame_id, trk_tlwhs, trk_ids, rtn_events=False)
        if self.return_fn and self.return_fp:
            return self.acc, fns, fps, matched, fp_confs
        return self.acc
Ejemplo n.º 4
0
    def eval_file(self, filename):
        self.reset_accumulator()

        result_frame_dict = read_results(filename, self.data_type,
                                         is_gt=False)  # 加载检测结果
        frames = sorted(
            list(
                set(self.gt_frame_dict.keys())
                | set(result_frame_dict.keys())))  # 帧的并集
        for frame_id in frames:
            trk_objs = result_frame_dict.get(frame_id, [])
            trk_tlwhs, trk_ids = unzip_objs(trk_objs)[:2]  # 预测track中的边框、id
            self.eval_frame(frame_id, trk_tlwhs, trk_ids,
                            rtn_events=False)  # 用于和ground truth进行计算

        return self.acc