|
|
import numpy as np
|
|
|
import os
|
|
|
import glob
|
|
|
import motmetrics as mm
|
|
|
import sys
|
|
|
from yolox.evaluators.evaluation import Evaluator
|
|
|
|
|
|
|
|
|
def mkdir_if_missing(d):
|
|
|
if not os.path.exists(d):
|
|
|
os.makedirs(d)
|
|
|
|
|
|
|
|
|
def eval_mota(data_root, txt_path):
|
|
|
accs = []
|
|
|
seqs = sorted([s for s in os.listdir(data_root) if s.endswith('FRCNN')])
|
|
|
for seq in seqs:
|
|
|
video_out_path = os.path.join(txt_path, seq + '.txt')
|
|
|
evaluator = Evaluator(data_root, seq, 'mot', anno="gt_val_half.txt")
|
|
|
accs.append(evaluator.eval_file(video_out_path))
|
|
|
metrics = mm.metrics.motchallenge_metrics
|
|
|
mh = mm.metrics.create()
|
|
|
summary = Evaluator.get_summary(accs, seqs, metrics)
|
|
|
strsummary = mm.io.render_summary(
|
|
|
summary,
|
|
|
formatters=mh.formatters,
|
|
|
namemap=mm.io.motchallenge_metric_names
|
|
|
)
|
|
|
print(strsummary)
|
|
|
|
|
|
|
|
|
def get_mota(data_root, txt_path):
|
|
|
accs = []
|
|
|
seqs = sorted([s for s in os.listdir(data_root) if s.endswith('FRCNN')])
|
|
|
for seq in seqs:
|
|
|
video_out_path = os.path.join(txt_path, seq + '.txt')
|
|
|
evaluator = Evaluator(data_root, seq, 'mot')
|
|
|
accs.append(evaluator.eval_file(video_out_path))
|
|
|
metrics = mm.metrics.motchallenge_metrics
|
|
|
mh = mm.metrics.create()
|
|
|
summary = Evaluator.get_summary(accs, seqs, metrics)
|
|
|
strsummary = mm.io.render_summary(
|
|
|
summary,
|
|
|
formatters=mh.formatters,
|
|
|
namemap=mm.io.motchallenge_metric_names
|
|
|
)
|
|
|
mota = float(strsummary.split(' ')[-6][:-1])
|
|
|
return mota
|
|
|
|
|
|
|
|
|
def write_results_score(filename, results):
|
|
|
save_format = '{frame},{id},{x1},{y1},{w},{h},{s},-1,-1,-1\n'
|
|
|
with open(filename, 'w') as f:
|
|
|
for i in range(results.shape[0]):
|
|
|
frame_data = results[i]
|
|
|
frame_id = int(frame_data[0])
|
|
|
track_id = int(frame_data[1])
|
|
|
x1, y1, w, h = frame_data[2:6]
|
|
|
score = frame_data[6]
|
|
|
line = save_format.format(frame=frame_id, id=track_id, x1=x1, y1=y1, w=w, h=h, s=-1)
|
|
|
f.write(line)
|
|
|
|
|
|
|
|
|
def dti(txt_path, save_path, n_min=25, n_dti=20):
|
|
|
seq_txts = sorted(glob.glob(os.path.join(txt_path, '*.txt')))
|
|
|
for seq_txt in seq_txts:
|
|
|
seq_name = seq_txt.split('/')[-1]
|
|
|
seq_data = np.loadtxt(seq_txt, dtype=np.float64, delimiter=',')
|
|
|
min_id = int(np.min(seq_data[:, 1]))
|
|
|
max_id = int(np.max(seq_data[:, 1]))
|
|
|
seq_results = np.zeros((1, 10), dtype=np.float64)
|
|
|
for track_id in range(min_id, max_id + 1):
|
|
|
index = (seq_data[:, 1] == track_id)
|
|
|
tracklet = seq_data[index]
|
|
|
tracklet_dti = tracklet
|
|
|
if tracklet.shape[0] == 0:
|
|
|
continue
|
|
|
n_frame = tracklet.shape[0]
|
|
|
n_conf = np.sum(tracklet[:, 6] > 0.5)
|
|
|
if n_frame > n_min:
|
|
|
frames = tracklet[:, 0]
|
|
|
frames_dti = {}
|
|
|
for i in range(0, n_frame):
|
|
|
right_frame = frames[i]
|
|
|
if i > 0:
|
|
|
left_frame = frames[i - 1]
|
|
|
else:
|
|
|
left_frame = frames[i]
|
|
|
|
|
|
if 1 < right_frame - left_frame < n_dti:
|
|
|
num_bi = int(right_frame - left_frame - 1)
|
|
|
right_bbox = tracklet[i, 2:6]
|
|
|
left_bbox = tracklet[i - 1, 2:6]
|
|
|
for j in range(1, num_bi + 1):
|
|
|
curr_frame = j + left_frame
|
|
|
curr_bbox = (curr_frame - left_frame) * (right_bbox - left_bbox) / \
|
|
|
(right_frame - left_frame) + left_bbox
|
|
|
frames_dti[curr_frame] = curr_bbox
|
|
|
num_dti = len(frames_dti.keys())
|
|
|
if num_dti > 0:
|
|
|
data_dti = np.zeros((num_dti, 10), dtype=np.float64)
|
|
|
for n in range(num_dti):
|
|
|
data_dti[n, 0] = list(frames_dti.keys())[n]
|
|
|
data_dti[n, 1] = track_id
|
|
|
data_dti[n, 2:6] = frames_dti[list(frames_dti.keys())[n]]
|
|
|
data_dti[n, 6:] = [1, -1, -1, -1]
|
|
|
tracklet_dti = np.vstack((tracklet, data_dti))
|
|
|
seq_results = np.vstack((seq_results, tracklet_dti))
|
|
|
save_seq_txt = os.path.join(save_path, seq_name)
|
|
|
seq_results = seq_results[1:]
|
|
|
seq_results = seq_results[seq_results[:, 0].argsort()]
|
|
|
write_results_score(save_seq_txt, seq_results)
|
|
|
|
|
|
|
|
|
def dti_kitti(txt_path, save_path, n_min=30, n_dti=20):
|
|
|
seq_txts = sorted(glob.glob(os.path.join(txt_path, '*.txt')))
|
|
|
for seq_txt in seq_txts:
|
|
|
seq_name = seq_txt.split('/')[-1]
|
|
|
seq_data = np.loadtxt(seq_txt, dtype=np.float64, delimiter=',')
|
|
|
min_id = int(np.min(seq_data[:, 1]))
|
|
|
max_id = int(np.max(seq_data[:, 1]))
|
|
|
seq_results = np.zeros((1, 10), dtype=np.float64)
|
|
|
for track_id in range(min_id, max_id + 1):
|
|
|
index = (seq_data[:, 1] == track_id)
|
|
|
tracklet = seq_data[index]
|
|
|
tracklet_dti = tracklet
|
|
|
if tracklet.shape[0] == 0:
|
|
|
continue
|
|
|
n_frame = tracklet.shape[0]
|
|
|
n_conf = np.sum(tracklet[:, 6] > 0.5)
|
|
|
if n_frame > n_min:
|
|
|
frames = tracklet[:, 0]
|
|
|
frames_dti = {}
|
|
|
for i in range(0, n_frame):
|
|
|
right_frame = frames[i]
|
|
|
if i > 0:
|
|
|
left_frame = frames[i - 1]
|
|
|
else:
|
|
|
left_frame = frames[i]
|
|
|
|
|
|
if 1 < right_frame - left_frame < n_dti:
|
|
|
num_bi = int(right_frame - left_frame - 1)
|
|
|
right_bbox = tracklet[i, 2:6]
|
|
|
left_bbox = tracklet[i - 1, 2:6]
|
|
|
for j in range(1, num_bi + 1):
|
|
|
curr_frame = j + left_frame
|
|
|
curr_bbox = (curr_frame - left_frame) * (right_bbox - left_bbox) / \
|
|
|
(right_frame - left_frame) + left_bbox
|
|
|
frames_dti[curr_frame] = curr_bbox
|
|
|
num_dti = len(frames_dti.keys())
|
|
|
if num_dti > 0:
|
|
|
data_dti = np.zeros((num_dti, 10), dtype=np.float64)
|
|
|
for n in range(num_dti):
|
|
|
data_dti[n, 0] = list(frames_dti.keys())[n]
|
|
|
data_dti[n, 1] = track_id
|
|
|
data_dti[n, 2:6] = frames_dti[list(frames_dti.keys())[n]]
|
|
|
data_dti[n, 6:] = [1, -1, -1, -1]
|
|
|
tracklet_dti = np.vstack((tracklet, data_dti))
|
|
|
seq_results = np.vstack((seq_results, tracklet_dti))
|
|
|
save_seq_txt = os.path.join(save_path, seq_name)
|
|
|
seq_results = seq_results[1:]
|
|
|
seq_results = seq_results[seq_results[:, 0].argsort()]
|
|
|
write_results_score(save_seq_txt, seq_results)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
txt_path, save_path = sys.argv[1], sys.argv[2]
|
|
|
data_root = 'datasets/mot/train'
|
|
|
mkdir_if_missing(save_path)
|
|
|
dti(txt_path, save_path, n_min=30, n_dti=20)
|
|
|
print('Before DTI: ')
|
|
|
eval_mota(data_root, txt_path)
|
|
|
print('After DTI:')
|
|
|
eval_mota(data_root, save_path)
|
|
|
|