| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- # 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)
|