BBoxMaskPose-demo / mmpose /apis /inference_tracking.py
Miroslav Purkrabek
add code
a249588
# Copyright (c) OpenMMLab. All rights reserved.
import warnings
import numpy as np
from mmpose.evaluation.functional.nms import oks_iou
def _compute_iou(bboxA, bboxB):
"""Compute the Intersection over Union (IoU) between two boxes .
Args:
bboxA (list): The first bbox info (left, top, right, bottom, score).
bboxB (list): The second bbox info (left, top, right, bottom, score).
Returns:
float: The IoU value.
"""
x1 = max(bboxA[0], bboxB[0])
y1 = max(bboxA[1], bboxB[1])
x2 = min(bboxA[2], bboxB[2])
y2 = min(bboxA[3], bboxB[3])
inter_area = max(0, x2 - x1) * max(0, y2 - y1)
bboxA_area = (bboxA[2] - bboxA[0]) * (bboxA[3] - bboxA[1])
bboxB_area = (bboxB[2] - bboxB[0]) * (bboxB[3] - bboxB[1])
union_area = float(bboxA_area + bboxB_area - inter_area)
if union_area == 0:
union_area = 1e-5
warnings.warn('union_area=0 is unexpected')
iou = inter_area / union_area
return iou
def _track_by_iou(res, results_last, thr):
"""Get track id using IoU tracking greedily."""
bbox = list(np.squeeze(res.pred_instances.bboxes, axis=0))
max_iou_score = -1
max_index = -1
match_result = {}
for index, res_last in enumerate(results_last):
bbox_last = list(np.squeeze(res_last.pred_instances.bboxes, axis=0))
iou_score = _compute_iou(bbox, bbox_last)
if iou_score > max_iou_score:
max_iou_score = iou_score
max_index = index
if max_iou_score > thr:
track_id = results_last[max_index].track_id
match_result = results_last[max_index]
del results_last[max_index]
else:
track_id = -1
return track_id, results_last, match_result
def _track_by_oks(res, results_last, thr, sigmas=None):
"""Get track id using OKS tracking greedily."""
keypoint = np.concatenate((res.pred_instances.keypoints,
res.pred_instances.keypoint_scores[:, :, None]),
axis=2)
keypoint = np.squeeze(keypoint, axis=0).reshape((-1))
area = np.squeeze(res.pred_instances.areas, axis=0)
max_index = -1
match_result = {}
if len(results_last) == 0:
return -1, results_last, match_result
keypoints_last = np.array([
np.squeeze(
np.concatenate(
(res_last.pred_instances.keypoints,
res_last.pred_instances.keypoint_scores[:, :, None]),
axis=2),
axis=0).reshape((-1)) for res_last in results_last
])
area_last = np.array([
np.squeeze(res_last.pred_instances.areas, axis=0)
for res_last in results_last
])
oks_score = oks_iou(
keypoint, keypoints_last, area, area_last, sigmas=sigmas)
max_index = np.argmax(oks_score)
if oks_score[max_index] > thr:
track_id = results_last[max_index].track_id
match_result = results_last[max_index]
del results_last[max_index]
else:
track_id = -1
return track_id, results_last, match_result