pesi
/

Luigi commited on
Commit
6dfe441
1 Parent(s): b58a63b

Add appropriate pre- to input image and postprocessing to validate function

Browse files
Files changed (1) hide show
  1. convert_to_mixed.py +54 -18
convert_to_mixed.py CHANGED
@@ -1,8 +1,5 @@
1
- import sys
2
  import numpy as np
3
- from PIL import Image
4
  import onnx
5
- import onnxruntime as ort
6
  from onnxconverter_common import auto_mixed_precision_model_path
7
  import argparse
8
  from rtmo_gpu import RTMO_GPU, draw_skeleton
@@ -24,28 +21,49 @@ def detect_model_input_size(model_path):
24
  return tuple(dims[2:4]) # Return (height, width)
25
  raise ValueError("Input node 'input' not found in the model")
26
 
27
- def load_and_preprocess_image(image_path, size=(224, 224)):
28
- image = Image.open(image_path).convert('RGB')
29
- image = image.resize(size)
30
- image = np.array(image).astype(np.float32) / 255.
31
- image = np.transpose(image, (2, 0, 1))
32
- image = np.expand_dims(image, axis=0)
 
33
  return image
34
 
35
- def validate_pose(res1, res2):
36
- rtmo = RTMO_GPU(args.source_model_path)
37
- poses1 = rtmo.postprocess(res1)
38
- poses2 = rtmo.postprocess(res2)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
 
40
- for k1, k2 in zip(poses1, poses2):
41
- if not np.allclose(k1, k2, rtol=args.rtol, atol=args.atol):
 
 
 
 
 
 
42
  return False
43
  return True
44
 
45
  def infer_on_image(onnx_model, model_input_size, test_image_path):
46
  body = RTMO_GPU(onnx_model=onnx_model,
47
  model_input_size=model_input_size,
48
- is_yolo_nas_pose=False)
49
 
50
  frame = cv2.imread(test_image_path)
51
  img_show = frame.copy()
@@ -63,12 +81,29 @@ def infer_on_image(onnx_model, model_input_size, test_image_path):
63
 
64
  def main(args):
65
  model_input_size = detect_model_input_size(args.source_model_path)
66
- input_feed = {'input':load_and_preprocess_image(args.test_image_path, size=model_input_size)}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
 
68
  auto_mixed_precision_model_path.auto_convert_mixed_precision_model_path(source_model_path=args.source_model_path,
69
  input_feed=input_feed,
70
  target_model_path=args.target_model_path,
71
- customized_validate_func=validate_pose,
72
  rtol=args.rtol, atol=args.atol,
73
  provider=PROVIDERS,
74
  keep_io_types=True,
@@ -83,6 +118,7 @@ if __name__ == "__main__":
83
  parser.add_argument("test_image_path", type=str, help="Path to a test image for validating the model conversion.")
84
  parser.add_argument('--rtol', type=float, default=0.01, help=' the relative tolerance to do validation')
85
  parser.add_argument('--atol', type=float, default=0.001, help=' the absolute tolerance to do validation')
 
86
 
87
  args = parser.parse_args()
88
 
 
 
1
  import numpy as np
 
2
  import onnx
 
3
  from onnxconverter_common import auto_mixed_precision_model_path
4
  import argparse
5
  from rtmo_gpu import RTMO_GPU, draw_skeleton
 
21
  return tuple(dims[2:4]) # Return (height, width)
22
  raise ValueError("Input node 'input' not found in the model")
23
 
24
+ def load_and_preprocess_image(image_path, preprocesss=None):
25
+
26
+ image = cv2.imread(image_path)
27
+
28
+ if preprocesss is not None:
29
+ image = preprocesss(image)
30
+
31
  return image
32
 
33
+ def compare_result(res1, res2):
34
+ keypoints1, scores1 = res1
35
+ keypoints2, scores2 = res2
36
+
37
+ from termcolor import colored
38
+
39
+ for d1, d2 in zip(keypoints1, keypoints2):
40
+ for i, (j1, j2) in enumerate(zip(d1, d2)):
41
+ x1, y1 = j1
42
+ x2, y2 = j2
43
+ print(f"Joint-{i}: X: {colored(x1,'green')} VS {colored(x2, 'blue')} Y: {colored(y1, 'green')} VS {colored(y2, 'blue')}")
44
+
45
+ for d1, d2 in zip(scores1, scores2):
46
+ for i, (s1, s2) in enumerate(zip(d1, d2)):
47
+ print(f"Joint-{i}: S: {colored(s1,'green')} VS {colored(s2, 'blue')}")
48
+
49
+
50
+ def validate_pose(res1, res2, postprocess=None):
51
 
52
+ if postprocess is not None:
53
+ res1 = postprocess(res1)
54
+ res2 = postprocess(res2)
55
+
56
+ compare_result(res1, res2)
57
+
58
+ for r1, r2 in zip(res1, res2):
59
+ if not np.allclose(r1, r2, rtol=args.rtol, atol=args.atol):
60
  return False
61
  return True
62
 
63
  def infer_on_image(onnx_model, model_input_size, test_image_path):
64
  body = RTMO_GPU(onnx_model=onnx_model,
65
  model_input_size=model_input_size,
66
+ is_yolo_nas_pose=args.yolo_nas_pose)
67
 
68
  frame = cv2.imread(test_image_path)
69
  img_show = frame.copy()
 
81
 
82
  def main(args):
83
  model_input_size = detect_model_input_size(args.source_model_path)
84
+
85
+ body = RTMO_GPU(onnx_model=args.source_model_path,
86
+ model_input_size=model_input_size,
87
+ is_yolo_nas_pose=args.yolo_nas_pose)
88
+
89
+ def preprocess(image, body, is_yolo_nas_pose):
90
+
91
+ img, _ = body.preprocess(image)
92
+
93
+ # build input to (1, 3, H, W)
94
+ img = img.transpose(2, 0, 1)
95
+ img = np.ascontiguousarray(img, dtype=np.float32 if not is_yolo_nas_pose else np.uint8)
96
+ img = img[None, :, :, :]
97
+ return img
98
+
99
+ image = load_and_preprocess_image(args.test_image_path, lambda img: preprocess(img, body, args.yolo_nas_pose))
100
+
101
+ input_feed = {'input': image}
102
 
103
  auto_mixed_precision_model_path.auto_convert_mixed_precision_model_path(source_model_path=args.source_model_path,
104
  input_feed=input_feed,
105
  target_model_path=args.target_model_path,
106
+ customized_validate_func=lambda res1,res2:validate_pose(res1, res2, body.postprocess),
107
  rtol=args.rtol, atol=args.atol,
108
  provider=PROVIDERS,
109
  keep_io_types=True,
 
118
  parser.add_argument("test_image_path", type=str, help="Path to a test image for validating the model conversion.")
119
  parser.add_argument('--rtol', type=float, default=0.01, help=' the relative tolerance to do validation')
120
  parser.add_argument('--atol', type=float, default=0.001, help=' the absolute tolerance to do validation')
121
+ parser.add_argument('--yolo_nas_pose', action='store_true', help='Use YOLO NAS Pose (flat format only) instead of RTMO Model')
122
 
123
  args = parser.parse_args()
124