pesi
/

Luigi commited on
Commit
58a44cf
1 Parent(s): bbf20b6

Add model format (ONNX/Engine) & input size detection (based on file header, not on filename) for RTMO

Browse files
Files changed (3) hide show
  1. rtmo_demo.py +1 -5
  2. rtmo_demo_batch.py +1 -2
  3. rtmo_gpu.py +42 -4
rtmo_demo.py CHANGED
@@ -20,11 +20,7 @@ if __name__ == "__main__":
20
 
21
  model = args.model_path # 'rtmo-s_8xb32-600e_body7-640x640.onnx'
22
 
23
- # Only Tiny Model has (416,416) as input model
24
- model_input_size = (416,416) if 'rtmo-t' in model.lower() and not args.yolo_nas_pose else (640,640)
25
-
26
- body = RTMO_GPU(model=model,
27
- model_input_size=model_input_size, is_yolo_nas_pose=args.yolo_nas_pose)
28
 
29
  for mp4_path in Path(args.path).glob('*'):
30
 
 
20
 
21
  model = args.model_path # 'rtmo-s_8xb32-600e_body7-640x640.onnx'
22
 
23
+ body = RTMO_GPU(model=model, is_yolo_nas_pose=args.yolo_nas_pose)
 
 
 
 
24
 
25
  for mp4_path in Path(args.path).glob('*'):
26
 
rtmo_demo_batch.py CHANGED
@@ -74,10 +74,9 @@ if __name__ == "__main__":
74
  args = parser.parse_args()
75
 
76
  onnx_model = args.model_path # Example: 'rtmo-s_8xb32-600e_body7-640x640.onnx'
77
- model_input_size = (416, 416) if 'rtmo-t' in onnx_model.lower() else (640, 640)
78
 
79
  # Instantiate the RTMO_GPU_Batch instead of RTMO_GPU
80
- body_estimator = RTMO_GPU_Batch(onnx_model=onnx_model, model_input_size=model_input_size)
81
 
82
  for mp4_path in Path(args.path).glob('*'):
83
  process_video(str(mp4_path), body_estimator, args.batch_size)
 
74
  args = parser.parse_args()
75
 
76
  onnx_model = args.model_path # Example: 'rtmo-s_8xb32-600e_body7-640x640.onnx'
 
77
 
78
  # Instantiate the RTMO_GPU_Batch instead of RTMO_GPU
79
+ body_estimator = RTMO_GPU_Batch(model=onnx_model)
80
 
81
  for mp4_path in Path(args.path).glob('*'):
82
  process_video(str(mp4_path), body_estimator, args.batch_size)
rtmo_gpu.py CHANGED
@@ -237,6 +237,43 @@ def draw_skeleton(img,
237
  raise NotImplementedError
238
  return img
239
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
240
  class RTMO_GPU(object):
241
 
242
  def preprocess(self, img: np.ndarray):
@@ -388,7 +425,6 @@ class RTMO_GPU(object):
388
 
389
  def __init__(self,
390
  model: str = None,
391
- model_input_size: tuple = (640, 640),
392
  mean: tuple = None,
393
  std: tuple = None,
394
  device: str = 'cuda',
@@ -399,13 +435,15 @@ class RTMO_GPU(object):
399
  raise FileNotFoundError(f"The specified ONNX model file was not found: {model}")
400
 
401
  self.model = model
402
- if model.endswith('.onnx'):
403
  self.model_format = 'onnx'
404
- elif model.endswith('.engine'):
 
405
  self.model_format = 'engine'
406
  from polygraphy.backend.common import BytesFromPath
407
  from polygraphy.backend.trt import EngineFromBytes, TrtRunner, load_plugins
408
  load_plugins(plugins=['libmmdeploy_tensorrt_ops.so'])
 
409
  else:
410
  raise TypeError("Your model is neither ONNX nor Engine !")
411
 
@@ -431,7 +469,7 @@ class RTMO_GPU(object):
431
  engine = EngineFromBytes(BytesFromPath(model))
432
  self.session = TrtRunner(engine)
433
 
434
- self.model_input_size = model_input_size
435
  self.mean = mean
436
  self.std = std
437
  self.device = device
 
237
  raise NotImplementedError
238
  return img
239
 
240
+ def is_onnx_model(model_path):
241
+ try:
242
+ import onnx
243
+ onnx_model = onnx.load(model_path)
244
+ onnx.checker.check_model(onnx_model)
245
+ return True
246
+ except Exception as e:
247
+ return False
248
+
249
+ def is_trt_engine(model_path):
250
+ try:
251
+ from polygraphy.backend.common import BytesFromPath
252
+ from polygraphy.backend.trt import EngineFromBytes
253
+ engine = EngineFromBytes(BytesFromPath(model_path))
254
+ return engine is not None
255
+ except Exception:
256
+ return False
257
+
258
+ def get_onnx_input_shapes(model_path):
259
+ from polygraphy.backend.onnx.loader import OnnxFromPath
260
+ from polygraphy.backend.onnx import infer_shapes
261
+ model = OnnxFromPath(model_path)()
262
+ model = infer_shapes(model)
263
+ input_shapes = {inp.name: inp.type.tensor_type.shape for inp in model.graph.input}
264
+ return {name: [dim.dim_value if dim.dim_value > 0 else 'Dynamic' for dim in shape_proto.dim]
265
+ for name, shape_proto in input_shapes.items()}
266
+
267
+ def get_trt_input_shapes(model_path):
268
+ input_shapes = {}
269
+ import tensorrt as trt
270
+ with open(model_path, "rb") as f, trt.Runtime(trt.Logger(trt.Logger.WARNING)) as runtime:
271
+ engine = runtime.deserialize_cuda_engine(f.read())
272
+ for binding in engine:
273
+ if engine.binding_is_input(binding):
274
+ input_shapes[binding] = engine.get_binding_shape(binding)
275
+ return input_shapes
276
+
277
  class RTMO_GPU(object):
278
 
279
  def preprocess(self, img: np.ndarray):
 
425
 
426
  def __init__(self,
427
  model: str = None,
 
428
  mean: tuple = None,
429
  std: tuple = None,
430
  device: str = 'cuda',
 
435
  raise FileNotFoundError(f"The specified ONNX model file was not found: {model}")
436
 
437
  self.model = model
438
+ if is_onnx_model(model):
439
  self.model_format = 'onnx'
440
+ self.input_shape = get_onnx_input_shapes(self.model)['input']
441
+ elif is_trt_engine(model):
442
  self.model_format = 'engine'
443
  from polygraphy.backend.common import BytesFromPath
444
  from polygraphy.backend.trt import EngineFromBytes, TrtRunner, load_plugins
445
  load_plugins(plugins=['libmmdeploy_tensorrt_ops.so'])
446
+ self.input_shape = get_trt_input_shapes(self.model)['input']
447
  else:
448
  raise TypeError("Your model is neither ONNX nor Engine !")
449
 
 
469
  engine = EngineFromBytes(BytesFromPath(model))
470
  self.session = TrtRunner(engine)
471
 
472
+ self.model_input_size = self.input_shape[2:4] # B, C, H, W,
473
  self.mean = mean
474
  self.std = std
475
  self.device = device