更新 detacttracking
This commit is contained in:
118
detecttracking/tracking/utils/processboxes.py
Normal file
118
detecttracking/tracking/utils/processboxes.py
Normal file
@ -0,0 +1,118 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created on Wed Sep 20 14:28:20 2023
|
||||
|
||||
@author: ym
|
||||
"""
|
||||
import numpy as np
|
||||
from scipy.spatial.distance import cdist
|
||||
|
||||
|
||||
def boxes_add_fid(tboxes):
|
||||
'''
|
||||
将 bboxes 对应的帧索引添加到 boxes 最后一列
|
||||
Return:
|
||||
bboxes: [x1, y1, x2, y2, track_id, score, cls, frame_index]
|
||||
'''
|
||||
|
||||
bboxes = np.empty((0, 8), dtype = np.float32)
|
||||
for tbox, f in tboxes:
|
||||
data = tbox.numpy()
|
||||
|
||||
frame = f * np.ones([data.shape[0], 1])
|
||||
bbox = np.concatenate([data, frame], axis=1)
|
||||
bboxes = np.concatenate([bboxes, bbox], axis=0)
|
||||
|
||||
return bboxes
|
||||
|
||||
|
||||
|
||||
def array2list(bboxes):
|
||||
'''
|
||||
将 bboxes 变换为 track 列表
|
||||
bboxes: [x1, y1, x2, y2, track_id, score, cls, frame_index]
|
||||
Return:
|
||||
lboxes:列表,列表中元素具有同一 track_id,xywh 格式
|
||||
[x, y, w, h, track_id, score, cls, frame_index]
|
||||
'''
|
||||
track_ids = set(bboxes[:, 4])
|
||||
lboxes = []
|
||||
for t_id in track_ids:
|
||||
idx = np.where(bboxes[:, 4] == t_id)[0]
|
||||
box = bboxes[idx, :]
|
||||
|
||||
x = (box[:, 0] + box[:, 2]) / 2
|
||||
y = (box[:, 1] + box[:, 3]) / 2
|
||||
|
||||
# box: [x, y, w, h, track_id, score, cls, frame_index]
|
||||
box[:, 2] = box[:, 2] - box[:, 0]
|
||||
box[:, 3] = box[:, 3] - box[:, 1]
|
||||
box[:, 0] = x
|
||||
box[:, 1] = y
|
||||
|
||||
lboxes.append(box)
|
||||
|
||||
return lboxes
|
||||
|
||||
|
||||
def max_dist_track(tboxes):
|
||||
|
||||
'''
|
||||
计算 tboxes 中最大dist的 track
|
||||
Return:
|
||||
'''
|
||||
|
||||
max_track_dist, max_dist = 0, 0
|
||||
for track in tboxes:
|
||||
box = track[:, :4].astype(int)
|
||||
|
||||
dist = cdist(box[:, :2], box[:, :2])
|
||||
|
||||
dm = np.max(dist)
|
||||
if dm > max_dist:
|
||||
max_dist = dm
|
||||
max_track = track.copy()
|
||||
max_track_dist = dist.copy()
|
||||
|
||||
|
||||
# 同一 track_id 中目标中心移动最大距离的索引(ix1, ix2)
|
||||
indx, indy = np.where(dist == dm)
|
||||
ix1, ix2 = indx[0], indy[0]
|
||||
# 确保 ix1 < ix2,索引 ix1 是开始时的视频
|
||||
if ix1 > ix2: ix1, ix2 = ix2, ix1
|
||||
|
||||
# =============================================================================
|
||||
# # =============================================================================
|
||||
# # 逻辑分析
|
||||
# # =============================================================================
|
||||
# Scanzone = ((0, int(Height/4)), (int(2*Weight/3), Weight))
|
||||
# if max_track.shape[0] > 10:
|
||||
#
|
||||
# # max_track 视频序列的第一帧索引 idx1
|
||||
# frame_1 = int(min(max_track[:, 7]))
|
||||
# idx1 = np.where(max_track[:, 7] == frame_1)[0][0]
|
||||
#
|
||||
# # max_track 视频序列的最后一帧索引 idx2
|
||||
# frame_2 = int(max(max_track[:, 7]))
|
||||
# idx2 = np.where(max_track[:, 7] == frame_2)[0][0]
|
||||
#
|
||||
# # max_track 视频序列的第一帧目标位置中心 (x1, y1)
|
||||
# x1, y1 = max_track[idx1, :2]
|
||||
#
|
||||
# # max_track 视频序列的第最后一帧目标位置中心 (x2, y2)
|
||||
# x2, y2 = max_track[idx2, :2]
|
||||
#
|
||||
#
|
||||
# # track序列第一帧和最后一帧的距离,该距离和 mx_dist 不是一个概念
|
||||
# dist_1_2 = max_track_dist[idx1, idx2]
|
||||
#
|
||||
# if max_dist < 3 * Height/10:
|
||||
# State = Uncertain
|
||||
#
|
||||
# elif y1 > y2:
|
||||
# State = TakeOut
|
||||
#
|
||||
# elif y1 < y2:
|
||||
# State = PutIn
|
||||
# =============================================================================
|
||||
return max_track, max_dist
|
Reference in New Issue
Block a user