Skip to content

Commit 47b6ac6

Browse files
author
agirbau
committed
Added ignore zones for UA-DETRAC
1 parent d261d16 commit 47b6ac6

File tree

3 files changed

+101
-11
lines changed

3 files changed

+101
-11
lines changed

motmetrics/apps/eval_detrac.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
from pathlib import Path
2020

2121
import motmetrics as mm
22+
# Andreu
23+
from motmetrics.utils import is_in_region
2224

2325

2426
def parse_args():
@@ -67,13 +69,25 @@ def parse_args():
6769
return parser.parse_args()
6870

6971

72+
# Andreu
73+
def filter_dets_by_zone(gt_df, test_df):
74+
ig_region = gt_df[['X_reg', 'Y_reg', 'W_reg', 'H_reg']].dropna().values
75+
dets = test_df[['X', 'Y', 'Width', 'Height']]
76+
for idx, row in dets.iterrows():
77+
bbox = [dets.at[idx, 'X'], dets.at[idx, 'Y'], dets.at[idx, 'Width'], dets.at[idx, 'Height']]
78+
for reg in ig_region:
79+
if is_in_region(bbox, reg):
80+
test_df.drop([idx], axis=0, inplace=True)
81+
break
82+
7083
def compare_dataframes(gts, ts):
7184
"""Builds accumulator for each sequence."""
7285
accs = []
7386
names = []
7487
for k, tsacc in ts.items():
7588
if k in gts:
7689
logging.info('Comparing %s...', k)
90+
filter_dets_by_zone(gts[k], tsacc)
7791
accs.append(mm.utils.compare_to_groundtruth(gts[k], tsacc, 'iou', distth=0.5))
7892
names.append(k)
7993
else:
@@ -105,6 +119,17 @@ def main():
105119
gt = OrderedDict([(os.path.splitext(Path(f).parts[-1])[0], mm.io.loadtxt(f, fmt=args.gtfmt)) for f in gtfiles])
106120
ts = OrderedDict([(os.path.splitext(Path(f).parts[-1])[0], mm.io.loadtxt(f, fmt=args.tsfmt)) for f in tsfiles])
107121

122+
# # Debug
123+
# # f = gtfiles[1]
124+
# # seq = os.path.splitext(Path(f).parts[-1])[0]
125+
# seq = 'MVI_39511'
126+
# f_gt = gtfiles[0].split('/')[:-1]
127+
# f = '/'.join(f_gt) + '/' + seq + '.xml'
128+
# gt = OrderedDict([(seq, mm.io.loadtxt(f, fmt=args.gtfmt))])
129+
# f_test = tsfiles[0].split('/')[:-1]
130+
# f = '/'.join(f_test) + '/' + seq + '.txt'
131+
# ts = OrderedDict([(seq, mm.io.loadtxt(f, fmt=args.tsfmt))])
132+
108133
mh = mm.metrics.create()
109134
accs, names = compare_dataframes(gt, ts)
110135

motmetrics/io.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import pandas as pd
1919
import scipy.io
2020
import xmltodict
21+
# Andreu
22+
from motmetrics.utils import is_in_region
2123

2224

2325
class Format(Enum):
@@ -271,6 +273,19 @@ def load_detrac_xml(fname):
271273
with io.open(fname) as fd:
272274
doc = xmltodict.parse(fd.read())
273275
frameList = doc['sequence']['frame']
276+
ignored_region_list = doc['sequence']['ignored_region']
277+
if type(ignored_region_list['box']) != list:
278+
ignored_region_list['box'] = [ignored_region_list['box']]
279+
280+
# Andreu
281+
parsed_ig = []
282+
for ig in ignored_region_list['box']:
283+
row = []
284+
row.append(float(ig['@left']))
285+
row.append(float(ig['@top']))
286+
row.append(float(ig['@width']))
287+
row.append(float(ig['@height']))
288+
parsed_ig.append(row)
274289

275290
parsedGT = []
276291
for f in frameList:
@@ -280,6 +295,7 @@ def load_detrac_xml(fname):
280295
targetList = [targetList]
281296

282297
for t in targetList:
298+
flag_ignore = False
283299
row = []
284300
row.append(fid)
285301
row.append(int(t['@id']))
@@ -291,10 +307,20 @@ def load_detrac_xml(fname):
291307
row.append(-1)
292308
row.append(-1)
293309
row.append(-1)
294-
parsedGT.append(row)
310+
bbox = [row[2], row[3], row[4], row[5]]
311+
for reg in parsed_ig:
312+
if is_in_region(bbox, reg):
313+
flag_ignore = True
314+
break
315+
if not flag_ignore:
316+
parsedGT.append(row)
295317

296318
df = pd.DataFrame(parsedGT,
297319
columns=['FrameId', 'Id', 'X', 'Y', 'Width', 'Height', 'Confidence', 'ClassId', 'Visibility', 'unused'])
320+
321+
df_reg = pd.DataFrame(parsed_ig, columns=['X_reg', 'Y_reg', 'W_reg', 'H_reg'])
322+
df = df.append(df_reg)
323+
298324
df.set_index(['FrameId', 'Id'], inplace=True)
299325

300326
# Account for matlab convention.

motmetrics/utils.py

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
from __future__ import print_function
1313

1414
import numpy as np
15+
from shapely.geometry import Point
16+
from shapely.geometry.polygon import Polygon
1517

1618
from motmetrics.distances import iou_matrix, norm2squared_matrix
1719
from motmetrics.mot import MOTAccumulator
@@ -71,16 +73,14 @@ def compute_euc(a, b):
7173
oids = np.empty(0)
7274
hids = np.empty(0)
7375
dists = np.empty((0, 0))
74-
75-
fgt = fid_to_fgt.get(fid, None)
76-
fdt = fid_to_fdt.get(fid, None)
77-
if fgt is not None and fdt is not None:
78-
oids = fgt.index.get_level_values(1)
79-
hids = fdt.index.get_level_values(1)
80-
if len(oids) > 0 and len(hids) > 0:
81-
# dists = compute_dist(fgt[distfields].values, fdt[distfields].values)
82-
dists = compute_dist(fgt.values, fdt.values)
83-
76+
if fid in fid_to_fgt:
77+
fgt = fid_to_fgt[fid]
78+
oids = fgt.index.get_level_values('Id')
79+
if fid in fid_to_fdt:
80+
fdt = fid_to_fdt[fid]
81+
hids = fdt.index.get_level_values('Id')
82+
if len(oids) > 0 and len(hids) > 0:
83+
dists = compute_dist(fgt.values, fdt.values)
8484
acc.update(oids, hids, dists, frameid=fid)
8585

8686
return acc
@@ -163,3 +163,42 @@ def compute_euc(a, b):
163163
acc.update(oids, hids, dists, frameid=fid, vf=vflag)
164164

165165
return acc, analysis
166+
167+
168+
# Andreu
169+
def is_in_region(bbox, reg):
170+
# Check if the 4 points of the bbox are inside region
171+
points = []
172+
# Center
173+
cx = bbox[0] + (bbox[2] / 2)
174+
cy = bbox[1] + (bbox[3] / 2)
175+
points.append(Point(cx, cy))
176+
# # Top-left
177+
# x1 = bbox[0]
178+
# y1 = bbox[1]
179+
# points.append(Point(x1, y1))
180+
# # Top-right
181+
# x1 = bbox[0] + bbox[2]
182+
# y1 = bbox[1]
183+
# points.append(Point(x1, y1))
184+
# # Bot-right
185+
# x1 = bbox[0] + bbox[2]
186+
# y1 = bbox[1] + bbox[3]
187+
# points.append(Point(x1, y1))
188+
# # Bot-left
189+
# x1 = bbox[0]
190+
# y1 = bbox[1] + bbox[3]
191+
# points.append(Point(x1, y1))
192+
193+
# Region
194+
p_xy0 = (reg[0], reg[1])
195+
p_xy1 = (reg[0] + reg[2], reg[1])
196+
p_xy2 = (reg[0] + reg[2], reg[1] + reg[3])
197+
p_xy3 = (reg[0], reg[1] + reg[3])
198+
region = [p_xy0, p_xy1, p_xy2, p_xy3]
199+
polygon = Polygon(region)
200+
201+
flags_inside = [polygon.contains(p) for p in points]
202+
flag_inside = all(flags_inside)
203+
204+
return flag_inside

0 commit comments

Comments
 (0)