infer_video_d2.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. # Copyright (c) 2018-present, Facebook, Inc.
  2. # All rights reserved.
  3. #
  4. # This source code is licensed under the license found in the
  5. # LICENSE file in the root directory of this source tree.
  6. #
  7. """Perform inference on a single video or all videos with a certain extension
  8. (e.g., .mp4) in a folder.
  9. """
  10. import detectron2
  11. from detectron2.utils.logger import setup_logger
  12. from detectron2.config import get_cfg
  13. from detectron2 import model_zoo
  14. from detectron2.engine import DefaultPredictor
  15. import subprocess as sp
  16. import numpy as np
  17. import time
  18. import argparse
  19. import sys
  20. import os
  21. import glob
  22. # def parse_args():
  23. # parser = argparse.ArgumentParser(description='End-to-end inference')
  24. # parser.add_argument(
  25. # '--cfg',
  26. # dest='cfg',
  27. # help='cfg model file (/path/to/model_config.yaml)',
  28. # default=None,
  29. # type=str
  30. # )
  31. # parser.add_argument(
  32. # '--output-dir',
  33. # dest='output_dir',
  34. # help='directory for visualization pdfs (default: /tmp/infer_simple)',
  35. # default='/tmp/infer_simple',
  36. # type=str
  37. # )
  38. # parser.add_argument(
  39. # '--image-ext',
  40. # dest='image_ext',
  41. # help='image file name extension (default: mp4)',
  42. # default='mp4',
  43. # type=str
  44. # )
  45. # parser.add_argument(
  46. # 'im_or_folder', help='image or folder of images', default=None
  47. # )
  48. # if len(sys.argv) == 1:
  49. # parser.print_help()
  50. # sys.exit(1)
  51. # return parser.parse_args()
  52. def get_resolution(filename):
  53. command = ['ffprobe', '-v', 'error', '-select_streams', 'v:0',
  54. '-show_entries', 'stream=width,height', '-of', 'csv=p=0', filename]
  55. pipe = sp.Popen(command, stdout=sp.PIPE, bufsize=-1)
  56. for line in pipe.stdout:
  57. w, h = line.decode().strip().split(',')
  58. return int(w), int(h)
  59. def read_video(filename):
  60. w, h = get_resolution(filename)
  61. command = ['ffmpeg',
  62. '-i', filename,
  63. '-f', 'image2pipe',
  64. '-pix_fmt', 'bgr24',
  65. '-vsync', '0',
  66. '-vcodec', 'rawvideo', '-']
  67. pipe = sp.Popen(command, stdout=sp.PIPE, bufsize=-1)
  68. while True:
  69. data = pipe.stdout.read(w*h*3)
  70. if not data:
  71. break
  72. yield np.frombuffer(data, dtype='uint8').reshape((h, w, 3))
  73. def run_3d(file_name):
  74. cfg = get_cfg()
  75. cfg_path = 'COCO-Keypoints/keypoint_rcnn_R_101_FPN_3x.yaml'
  76. cfg.merge_from_file(model_zoo.get_config_file(cfg_path))
  77. cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.7
  78. cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(cfg_path)
  79. predictor = DefaultPredictor(cfg)
  80. input_folder = file_name
  81. output_folder = file_name.replace(os.path.basename(file_name),"")
  82. if os.path.isdir(input_folder):
  83. im_list = glob.iglob(input_folder + '/*.mp4')
  84. else:
  85. im_list = [input_folder]
  86. for video_name in im_list:
  87. out_name = os.path.join(
  88. output_folder, os.path.basename(video_name)
  89. )
  90. print('Processing {}'.format(video_name))
  91. boxes = []
  92. segments = []
  93. keypoints = []
  94. for frame_i, im in enumerate(read_video(video_name)):
  95. t = time.time()
  96. outputs = predictor(im)['instances'].to('cpu')
  97. print('Frame {} processed in {:.3f}s'.format(frame_i, time.time() - t))
  98. has_bbox = False
  99. if outputs.has('pred_boxes'):
  100. bbox_tensor = outputs.pred_boxes.tensor.numpy()
  101. if len(bbox_tensor) > 0:
  102. has_bbox = True
  103. scores = outputs.scores.numpy()[:, None]
  104. bbox_tensor = np.concatenate((bbox_tensor, scores), axis=1)
  105. if has_bbox:
  106. kps = outputs.pred_keypoints.numpy()
  107. kps_xy = kps[:, :, :2]
  108. kps_prob = kps[:, :, 2:3]
  109. kps_logit = np.zeros_like(kps_prob) # Dummy
  110. kps = np.concatenate((kps_xy, kps_logit, kps_prob), axis=2)
  111. kps = kps.transpose(0, 2, 1)
  112. else:
  113. kps = []
  114. bbox_tensor = []
  115. # Mimic Detectron1 format
  116. cls_boxes = [[], bbox_tensor]
  117. cls_keyps = [[], kps]
  118. boxes.append(cls_boxes)
  119. segments.append(None)
  120. keypoints.append(cls_keyps)
  121. # Video resolution
  122. metadata = {
  123. 'w': im.shape[1],
  124. 'h': im.shape[0],
  125. }
  126. np.savez_compressed(out_name, boxes=boxes, segments=segments, keypoints=keypoints, metadata=metadata)
  127. if __name__ == '__main__':
  128. setup_logger()
  129. file_name = "original.mp4"
  130. run_3d(file_name)