Skip to content

Commit 7355785

Browse files
agirbaucheind
authored andcommitted
Added ignore zones for UA-DETRAC
1 parent 89dbe32 commit 7355785

File tree

3 files changed

+93
-1
lines changed

3 files changed

+93
-1
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:
@@ -107,6 +121,17 @@ def main():
107121
gt = OrderedDict([(os.path.splitext(Path(f).parts[-1])[0], mm.io.loadtxt(f, fmt=args.gtfmt)) for f in gtfiles])
108122
ts = OrderedDict([(os.path.splitext(Path(f).parts[-1])[0], mm.io.loadtxt(f, fmt=args.tsfmt)) for f in tsfiles])
109123

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

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: 41 additions & 0 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
@@ -176,3 +178,42 @@ def compute_euc(a, b):
176178
acc.update(oids, hids, dists, frameid=fid, vf=vflag)
177179

178180
return acc, analysis
181+
182+
183+
# Andreu
184+
def is_in_region(bbox, reg):
185+
# Check if the 4 points of the bbox are inside region
186+
points = []
187+
# Center
188+
cx = bbox[0] + (bbox[2] / 2)
189+
cy = bbox[1] + (bbox[3] / 2)
190+
points.append(Point(cx, cy))
191+
# # Top-left
192+
# x1 = bbox[0]
193+
# y1 = bbox[1]
194+
# points.append(Point(x1, y1))
195+
# # Top-right
196+
# x1 = bbox[0] + bbox[2]
197+
# y1 = bbox[1]
198+
# points.append(Point(x1, y1))
199+
# # Bot-right
200+
# x1 = bbox[0] + bbox[2]
201+
# y1 = bbox[1] + bbox[3]
202+
# points.append(Point(x1, y1))
203+
# # Bot-left
204+
# x1 = bbox[0]
205+
# y1 = bbox[1] + bbox[3]
206+
# points.append(Point(x1, y1))
207+
208+
# Region
209+
p_xy0 = (reg[0], reg[1])
210+
p_xy1 = (reg[0] + reg[2], reg[1])
211+
p_xy2 = (reg[0] + reg[2], reg[1] + reg[3])
212+
p_xy3 = (reg[0], reg[1] + reg[3])
213+
region = [p_xy0, p_xy1, p_xy2, p_xy3]
214+
polygon = Polygon(region)
215+
216+
flags_inside = [polygon.contains(p) for p in points]
217+
flag_inside = all(flags_inside)
218+
219+
return flag_inside

0 commit comments

Comments
 (0)