Skip to content

Commit a9fe2ee

Browse files
Support video input
1 parent c21aa94 commit a9fe2ee

File tree

2 files changed

+163
-0
lines changed

2 files changed

+163
-0
lines changed

lib/test/evaluation/tracker.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import cv2 as cv
77

88
from lib.utils.lmdb_utils import decode_img
9+
from pathlib import Path
10+
import numpy as np
911

1012

1113
def trackerlist(name: str, parameter_name: str, dataset_name: str, run_ids = None, display_name: str = None,
@@ -147,6 +149,128 @@ def _store_outputs(tracker_out: dict, defaults=None):
147149

148150
return output
149151

152+
def run_video(self, videofilepath, optional_box=None, debug=None, visdom_info=None, save_results=False):
153+
"""Run the tracker with the vieofile.
154+
args:
155+
debug: Debug level.
156+
"""
157+
158+
params = self.get_parameters()
159+
160+
debug_ = debug
161+
if debug is None:
162+
debug_ = getattr(params, 'debug', 0)
163+
params.debug = debug_
164+
165+
params.tracker_name = self.name
166+
params.param_name = self.parameter_name
167+
# self._init_visdom(visdom_info, debug_)
168+
169+
multiobj_mode = getattr(params, 'multiobj_mode', getattr(self.tracker_class, 'multiobj_mode', 'default'))
170+
171+
if multiobj_mode == 'default':
172+
tracker = self.create_tracker(params)
173+
174+
elif multiobj_mode == 'parallel':
175+
tracker = MultiObjectWrapper(self.tracker_class, params, self.visdom, fast_load=True)
176+
else:
177+
raise ValueError('Unknown multi object mode {}'.format(multiobj_mode))
178+
179+
assert os.path.isfile(videofilepath), "Invalid param {}".format(videofilepath)
180+
", videofilepath must be a valid videofile"
181+
182+
output_boxes = []
183+
184+
cap = cv.VideoCapture(videofilepath)
185+
display_name = 'Display: ' + tracker.params.tracker_name
186+
cv.namedWindow(display_name, cv.WINDOW_NORMAL | cv.WINDOW_KEEPRATIO)
187+
cv.resizeWindow(display_name, 960, 720)
188+
success, frame = cap.read()
189+
cv.imshow(display_name, frame)
190+
191+
def _build_init_info(box):
192+
return {'init_bbox': OrderedDict({1: box}), 'init_object_ids': [1, ], 'object_ids': [1, ],
193+
'sequence_object_ids': [1, ]}
194+
195+
if success is not True:
196+
print("Read frame from {} failed.".format(videofilepath))
197+
exit(-1)
198+
if optional_box is not None:
199+
assert isinstance(optional_box, (list, tuple))
200+
assert len(optional_box) == 4, "valid box's foramt is [x,y,w,h]"
201+
tracker.initialize(frame, _build_init_info(optional_box))
202+
output_boxes.append(optional_box)
203+
else:
204+
while True:
205+
# cv.waitKey()
206+
frame_disp = frame.copy()
207+
208+
cv.putText(frame_disp, 'Select target ROI and press ENTER', (20, 30), cv.FONT_HERSHEY_COMPLEX_SMALL,
209+
1.5, (0, 0, 0), 1)
210+
211+
x, y, w, h = cv.selectROI(display_name, frame_disp, fromCenter=False)
212+
init_state = [x, y, w, h]
213+
tracker.initialize(frame, _build_init_info(init_state))
214+
output_boxes.append(init_state)
215+
break
216+
217+
while True:
218+
ret, frame = cap.read()
219+
220+
if frame is None:
221+
break
222+
223+
frame_disp = frame.copy()
224+
225+
# Draw box
226+
out = tracker.track(frame)
227+
state = [int(s) for s in out['target_bbox'][1]]
228+
output_boxes.append(state)
229+
230+
cv.rectangle(frame_disp, (state[0], state[1]), (state[2] + state[0], state[3] + state[1]),
231+
(0, 255, 0), 5)
232+
233+
font_color = (0, 0, 0)
234+
cv.putText(frame_disp, 'Tracking!', (20, 30), cv.FONT_HERSHEY_COMPLEX_SMALL, 1,
235+
font_color, 1)
236+
cv.putText(frame_disp, 'Press r to reset', (20, 55), cv.FONT_HERSHEY_COMPLEX_SMALL, 1,
237+
font_color, 1)
238+
cv.putText(frame_disp, 'Press q to quit', (20, 80), cv.FONT_HERSHEY_COMPLEX_SMALL, 1,
239+
font_color, 1)
240+
241+
# Display the resulting frame
242+
cv.imshow(display_name, frame_disp)
243+
key = cv.waitKey(1)
244+
if key == ord('q'):
245+
break
246+
elif key == ord('r'):
247+
ret, frame = cap.read()
248+
frame_disp = frame.copy()
249+
250+
cv.putText(frame_disp, 'Select target ROI and press ENTER', (20, 30), cv.FONT_HERSHEY_COMPLEX_SMALL, 1.5,
251+
(0, 0, 0), 1)
252+
253+
cv.imshow(display_name, frame_disp)
254+
x, y, w, h = cv.selectROI(display_name, frame_disp, fromCenter=False)
255+
init_state = [x, y, w, h]
256+
tracker.initialize(frame, _build_init_info(init_state))
257+
output_boxes.append(init_state)
258+
259+
# When everything done, release the capture
260+
cap.release()
261+
cv.destroyAllWindows()
262+
263+
if save_results:
264+
if not os.path.exists(self.results_dir):
265+
os.makedirs(self.results_dir)
266+
video_name = Path(videofilepath).stem
267+
base_results_path = os.path.join(self.results_dir, 'video_{}'.format(video_name))
268+
269+
tracked_bb = np.array(output_boxes).astype(int)
270+
bbox_file = '{}.txt'.format(base_results_path)
271+
np.savetxt(bbox_file, tracked_bb, delimiter='\t', fmt='%d')
272+
273+
150274
def get_parameters(self):
151275
"""Get parameters."""
152276
param_module = importlib.import_module('lib.test.parameter.{}'.format(self.name))

tracking/video_demo.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import os
2+
import sys
3+
import argparse
4+
5+
prj_path = os.path.join(os.path.dirname(__file__), '..')
6+
if prj_path not in sys.path:
7+
sys.path.append(prj_path)
8+
9+
from lib.test.evaluation import Tracker
10+
11+
12+
def run_video(tracker_name, tracker_param, videofile, optional_box=None, debug=None, save_results=False):
13+
"""Run the tracker on your webcam.
14+
args:
15+
tracker_name: Name of tracking method.
16+
tracker_param: Name of parameter file.
17+
debug: Debug level.
18+
"""
19+
tracker = Tracker(tracker_name, tracker_param, "video")
20+
tracker.run_video(videofilepath=videofile, optional_box=optional_box, debug=debug, save_results=save_results)
21+
22+
23+
def main():
24+
parser = argparse.ArgumentParser(description='Run the tracker on your webcam.')
25+
parser.add_argument('tracker_name', type=str, help='Name of tracking method.')
26+
parser.add_argument('tracker_param', type=str, help='Name of parameter file.')
27+
parser.add_argument('videofile', type=str, help='path to a video file.')
28+
parser.add_argument('--optional_box', type=float, default=None, nargs="+", help='optional_box with format x y w h.')
29+
parser.add_argument('--debug', type=int, default=0, help='Debug level.')
30+
parser.add_argument('--save_results', dest='save_results', action='store_true', help='Save bounding boxes')
31+
parser.set_defaults(save_results=False)
32+
33+
args = parser.parse_args()
34+
35+
run_video(args.tracker_name, args.tracker_param, args.videofile, args.optional_box, args.debug, args.save_results)
36+
37+
38+
if __name__ == '__main__':
39+
main()

0 commit comments

Comments
 (0)