# Copyright (c) 2018-present, Facebook, Inc. # All rights reserved. # # This source code is licensed under the license found in the # LICENSE file in the root directory of this source tree. # """Perform inference on a single video or all videos with a certain extension (e.g., .mp4) in a folder. """ from infer_simple import * import subprocess as sp import numpy as np def get_resolution(filename): command = ['ffprobe', '-v', 'error', '-select_streams', 'v:0', '-show_entries', 'stream=width,height', '-of', 'csv=p=0', filename] pipe = sp.Popen(command, stdout=sp.PIPE, bufsize=-1) for line in pipe.stdout: w, h = line.decode().strip().split(',') return int(w), int(h) def read_video(filename): w, h = get_resolution(filename) command = ['ffmpeg', '-i', filename, '-f', 'image2pipe', '-pix_fmt', 'bgr24', '-vsync', '0', '-vcodec', 'rawvideo', '-'] pipe = sp.Popen(command, stdout=sp.PIPE, bufsize=-1) while True: data = pipe.stdout.read(w*h*3) if not data: break yield np.frombuffer(data, dtype='uint8').reshape((h, w, 3)) def main(args): logger = logging.getLogger(__name__) merge_cfg_from_file(args.cfg) cfg.NUM_GPUS = 1 args.weights = cache_url(args.weights, cfg.DOWNLOAD_CACHE) assert_and_infer_cfg(cache_urls=False) model = infer_engine.initialize_model_from_cfg(args.weights) dummy_coco_dataset = dummy_datasets.get_coco_dataset() if os.path.isdir(args.im_or_folder): im_list = glob.iglob(args.im_or_folder + '/*.' + args.image_ext) else: im_list = [args.im_or_folder] for video_name in im_list: out_name = os.path.join( args.output_dir, os.path.basename(video_name) ) print('Processing {}'.format(video_name)) boxes = [] segments = [] keypoints = [] for frame_i, im in enumerate(read_video(video_name)): logger.info('Frame {}'.format(frame_i)) timers = defaultdict(Timer) t = time.time() with c2_utils.NamedCudaScope(0): cls_boxes, cls_segms, cls_keyps = infer_engine.im_detect_all( model, im, None, timers=timers ) logger.info('Inference time: {:.3f}s'.format(time.time() - t)) for k, v in timers.items(): logger.info(' | {}: {:.3f}s'.format(k, v.average_time)) boxes.append(cls_boxes) segments.append(cls_segms) keypoints.append(cls_keyps) # Video resolution metadata = { 'w': im.shape[1], 'h': im.shape[0], } np.savez_compressed(out_name, boxes=boxes, segments=segments, keypoints=keypoints, metadata=metadata) if __name__ == '__main__': workspace.GlobalInit(['caffe2', '--caffe2_log_level=0']) setup_logging(__name__) args = parse_args() main(args)