ytfeng commited on
Commit
e6af279
·
1 Parent(s): 5c62c5c

Limit combinations of backends and targets in demos and benchmark (#145)

Browse files

* limit backend and target combination in demos and benchmark

* simpler version checking

Files changed (2) hide show
  1. demo.py +56 -49
  2. nanodet.py +3 -5
demo.py CHANGED
@@ -1,29 +1,21 @@
1
  import numpy as np
2
- import cv2
3
  import argparse
4
 
5
  from nanodet import NanoDet
6
 
7
- def str2bool(v):
8
- if v.lower() in ['on', 'yes', 'true', 'y', 't']:
9
- return True
10
- elif v.lower() in ['off', 'no', 'false', 'n', 'f']:
11
- return False
12
- else:
13
- raise NotImplementedError
14
-
15
- backends = [cv2.dnn.DNN_BACKEND_OPENCV, cv2.dnn.DNN_BACKEND_CUDA]
16
- targets = [cv2.dnn.DNN_TARGET_CPU, cv2.dnn.DNN_TARGET_CUDA, cv2.dnn.DNN_TARGET_CUDA_FP16]
17
- help_msg_backends = "Choose one of the computation backends: {:d}: OpenCV implementation (default); {:d}: CUDA"
18
- help_msg_targets = "Chose one of the target computation devices: {:d}: CPU (default); {:d}: CUDA; {:d}: CUDA fp16"
19
 
20
- try:
21
- backends += [cv2.dnn.DNN_BACKEND_TIMVX]
22
- targets += [cv2.dnn.DNN_TARGET_NPU]
23
- help_msg_backends += "; {:d}: TIMVX"
24
- help_msg_targets += "; {:d}: NPU"
25
- except:
26
- print('This version of OpenCV does not support TIM-VX and NPU. Visit https://github.com/opencv/opencv/wiki/TIM-VX-Backend-For-Running-OpenCV-On-NPU for more information.')
 
27
 
28
  classes = ('person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
29
  'train', 'truck', 'boat', 'traffic light', 'fire hydrant',
@@ -48,16 +40,16 @@ def letterbox(srcimg, target_size=(416, 416)):
48
  hw_scale = img.shape[0] / img.shape[1]
49
  if hw_scale > 1:
50
  newh, neww = target_size[0], int(target_size[1] / hw_scale)
51
- img = cv2.resize(img, (neww, newh), interpolation=cv2.INTER_AREA)
52
  left = int((target_size[1] - neww) * 0.5)
53
- img = cv2.copyMakeBorder(img, 0, 0, left, target_size[1] - neww - left, cv2.BORDER_CONSTANT, value=0) # add border
54
  else:
55
  newh, neww = int(target_size[0] * hw_scale), target_size[1]
56
- img = cv2.resize(img, (neww, newh), interpolation=cv2.INTER_AREA)
57
  top = int((target_size[0] - newh) * 0.5)
58
- img = cv2.copyMakeBorder(img, top, target_size[0] - newh - top, 0, 0, cv2.BORDER_CONSTANT, value=0)
59
  else:
60
- img = cv2.resize(img, target_size, interpolation=cv2.INTER_AREA)
61
 
62
  letterbox_scale = [top, left, newh, neww]
63
  return img, letterbox_scale
@@ -87,7 +79,7 @@ def vis(preds, res_img, letterbox_scale, fps=None):
87
  # draw FPS
88
  if fps is not None:
89
  fps_label = "FPS: %.2f" % fps
90
- cv2.putText(ret, fps_label, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
91
 
92
  # draw bboxes and labels
93
  for pred in preds:
@@ -97,37 +89,52 @@ def vis(preds, res_img, letterbox_scale, fps=None):
97
 
98
  # bbox
99
  xmin, ymin, xmax, ymax = unletterbox(bbox, ret.shape[:2], letterbox_scale)
100
- cv2.rectangle(ret, (xmin, ymin), (xmax, ymax), (0, 255, 0), thickness=2)
101
 
102
  # label
103
  label = "{:s}: {:.2f}".format(classes[classid], conf)
104
- cv2.putText(ret, label, (xmin, ymin - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), thickness=2)
105
 
106
  return ret
107
 
108
  if __name__=='__main__':
109
  parser = argparse.ArgumentParser(description='Nanodet inference using OpenCV an contribution by Sri Siddarth Chakaravarthy part of GSOC_2022')
110
- parser.add_argument('--input', '-i', type=str, help='Path to the input image. Omit for using default camera.')
111
- parser.add_argument('--model', '-m', type=str, default='object_detection_nanodet_2022nov.onnx', help="Path to the model")
112
- parser.add_argument('--backend', '-b', type=int, default=backends[0], help=help_msg_backends.format(*backends))
113
- parser.add_argument('--target', '-t', type=int, default=targets[0], help=help_msg_targets.format(*targets))
114
- parser.add_argument('--confidence', default=0.35, type=float, help='Class confidence')
115
- parser.add_argument('--nms', default=0.6, type=float, help='Enter nms IOU threshold')
116
- parser.add_argument('--save', '-s', type=str2bool, default=False, help='Set true to save results. This flag is invalid when using camera.')
117
- parser.add_argument('--vis', '-v', type=str2bool, default=True, help='Set true to open a window for result visualization. This flag is invalid when using camera.')
 
 
 
 
 
 
 
 
 
 
 
 
118
  args = parser.parse_args()
119
 
 
 
 
120
  model = NanoDet(modelPath= args.model,
121
  prob_threshold=args.confidence,
122
  iou_threshold=args.nms,
123
- backend_id=args.backend,
124
- target_id=args.target)
125
 
126
- tm = cv2.TickMeter()
127
  tm.reset()
128
  if args.input is not None:
129
- image = cv2.imread(args.input)
130
- input_blob = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
131
 
132
  # Letterbox transformation
133
  input_blob, letterbox_scale = letterbox(input_blob)
@@ -142,25 +149,25 @@ if __name__=='__main__':
142
 
143
  if args.save:
144
  print('Resutls saved to result.jpg\n')
145
- cv2.imwrite('result.jpg', img)
146
 
147
  if args.vis:
148
- cv2.namedWindow(args.input, cv2.WINDOW_AUTOSIZE)
149
- cv2.imshow(args.input, img)
150
- cv2.waitKey(0)
151
 
152
  else:
153
  print("Press any key to stop video capture")
154
  deviceId = 0
155
- cap = cv2.VideoCapture(deviceId)
156
 
157
- while cv2.waitKey(1) < 0:
158
  hasFrame, frame = cap.read()
159
  if not hasFrame:
160
  print('No frames grabbed!')
161
  break
162
 
163
- input_blob = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
164
  input_blob, letterbox_scale = letterbox(input_blob)
165
  # Inference
166
  tm.start()
@@ -169,6 +176,6 @@ if __name__=='__main__':
169
 
170
  img = vis(preds, frame, letterbox_scale, fps=tm.getFPS())
171
 
172
- cv2.imshow("NanoDet Demo", img)
173
 
174
  tm.reset()
 
1
  import numpy as np
2
+ import cv2 as cv
3
  import argparse
4
 
5
  from nanodet import NanoDet
6
 
7
+ # Check OpenCV version
8
+ assert cv.__version__ >= "4.7.0", \
9
+ "Please install latest opencv-python to try this demo: python3 -m pip install --upgrade opencv-python"
 
 
 
 
 
 
 
 
 
10
 
11
+ # Valid combinations of backends and targets
12
+ backend_target_pairs = [
13
+ [cv.dnn.DNN_BACKEND_OPENCV, cv.dnn.DNN_TARGET_CPU],
14
+ [cv.dnn.DNN_BACKEND_CUDA, cv.dnn.DNN_TARGET_CUDA],
15
+ [cv.dnn.DNN_BACKEND_CUDA, cv.dnn.DNN_TARGET_CUDA_FP16],
16
+ [cv.dnn.DNN_BACKEND_TIMVX, cv.dnn.DNN_TARGET_NPU],
17
+ [cv.dnn.DNN_BACKEND_CANN, cv.dnn.DNN_TARGET_NPU]
18
+ ]
19
 
20
  classes = ('person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
21
  'train', 'truck', 'boat', 'traffic light', 'fire hydrant',
 
40
  hw_scale = img.shape[0] / img.shape[1]
41
  if hw_scale > 1:
42
  newh, neww = target_size[0], int(target_size[1] / hw_scale)
43
+ img = cv.resize(img, (neww, newh), interpolation=cv.INTER_AREA)
44
  left = int((target_size[1] - neww) * 0.5)
45
+ img = cv.copyMakeBorder(img, 0, 0, left, target_size[1] - neww - left, cv.BORDER_CONSTANT, value=0) # add border
46
  else:
47
  newh, neww = int(target_size[0] * hw_scale), target_size[1]
48
+ img = cv.resize(img, (neww, newh), interpolation=cv.INTER_AREA)
49
  top = int((target_size[0] - newh) * 0.5)
50
+ img = cv.copyMakeBorder(img, top, target_size[0] - newh - top, 0, 0, cv.BORDER_CONSTANT, value=0)
51
  else:
52
+ img = cv.resize(img, target_size, interpolation=cv.INTER_AREA)
53
 
54
  letterbox_scale = [top, left, newh, neww]
55
  return img, letterbox_scale
 
79
  # draw FPS
80
  if fps is not None:
81
  fps_label = "FPS: %.2f" % fps
82
+ cv.putText(ret, fps_label, (10, 25), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
83
 
84
  # draw bboxes and labels
85
  for pred in preds:
 
89
 
90
  # bbox
91
  xmin, ymin, xmax, ymax = unletterbox(bbox, ret.shape[:2], letterbox_scale)
92
+ cv.rectangle(ret, (xmin, ymin), (xmax, ymax), (0, 255, 0), thickness=2)
93
 
94
  # label
95
  label = "{:s}: {:.2f}".format(classes[classid], conf)
96
+ cv.putText(ret, label, (xmin, ymin - 10), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), thickness=2)
97
 
98
  return ret
99
 
100
  if __name__=='__main__':
101
  parser = argparse.ArgumentParser(description='Nanodet inference using OpenCV an contribution by Sri Siddarth Chakaravarthy part of GSOC_2022')
102
+ parser.add_argument('--input', '-i', type=str,
103
+ help='Path to the input image. Omit for using default camera.')
104
+ parser.add_argument('--model', '-m', type=str,
105
+ default='object_detection_nanodet_2022nov.onnx', help="Path to the model")
106
+ parser.add_argument('--backend_target', '-bt', type=int, default=0,
107
+ help='''Choose one of the backend-target pair to run this demo:
108
+ {:d}: (default) OpenCV implementation + CPU,
109
+ {:d}: CUDA + GPU (CUDA),
110
+ {:d}: CUDA + GPU (CUDA FP16),
111
+ {:d}: TIM-VX + NPU,
112
+ {:d}: CANN + NPU
113
+ '''.format(*[x for x in range(len(backend_target_pairs))]))
114
+ parser.add_argument('--confidence', default=0.35, type=float,
115
+ help='Class confidence')
116
+ parser.add_argument('--nms', default=0.6, type=float,
117
+ help='Enter nms IOU threshold')
118
+ parser.add_argument('--save', '-s', action='store_true',
119
+ help='Specify to save results. This flag is invalid when using camera.')
120
+ parser.add_argument('--vis', '-v', action='store_true',
121
+ help='Specify to open a window for result visualization. This flag is invalid when using camera.')
122
  args = parser.parse_args()
123
 
124
+ backend_id = backend_target_pairs[args.backend_target][0]
125
+ target_id = backend_target_pairs[args.backend_target][1]
126
+
127
  model = NanoDet(modelPath= args.model,
128
  prob_threshold=args.confidence,
129
  iou_threshold=args.nms,
130
+ backend_id=backend_id,
131
+ target_id=target_id)
132
 
133
+ tm = cv.TickMeter()
134
  tm.reset()
135
  if args.input is not None:
136
+ image = cv.imread(args.input)
137
+ input_blob = cv.cvtColor(image, cv.COLOR_BGR2RGB)
138
 
139
  # Letterbox transformation
140
  input_blob, letterbox_scale = letterbox(input_blob)
 
149
 
150
  if args.save:
151
  print('Resutls saved to result.jpg\n')
152
+ cv.imwrite('result.jpg', img)
153
 
154
  if args.vis:
155
+ cv.namedWindow(args.input, cv.WINDOW_AUTOSIZE)
156
+ cv.imshow(args.input, img)
157
+ cv.waitKey(0)
158
 
159
  else:
160
  print("Press any key to stop video capture")
161
  deviceId = 0
162
+ cap = cv.VideoCapture(deviceId)
163
 
164
+ while cv.waitKey(1) < 0:
165
  hasFrame, frame = cap.read()
166
  if not hasFrame:
167
  print('No frames grabbed!')
168
  break
169
 
170
+ input_blob = cv.cvtColor(frame, cv.COLOR_BGR2RGB)
171
  input_blob, letterbox_scale = letterbox(input_blob)
172
  # Inference
173
  tm.start()
 
176
 
177
  img = vis(preds, frame, letterbox_scale, fps=tm.getFPS())
178
 
179
+ cv.imshow("NanoDet Demo", img)
180
 
181
  tm.reset()
nanodet.py CHANGED
@@ -37,12 +37,10 @@ class NanoDet:
37
  def name(self):
38
  return self.__class__.__name__
39
 
40
- def setBackend(self, backendId):
41
- self.backend_id = backendId
 
42
  self.net.setPreferableBackend(self.backend_id)
43
-
44
- def setTarget(self, targetId):
45
- self.target_id = targetId
46
  self.net.setPreferableTarget(self.target_id)
47
 
48
  def pre_process(self, img):
 
37
  def name(self):
38
  return self.__class__.__name__
39
 
40
+ def setBackendAndTarget(self, backendId, targetId):
41
+ self._backendId = backendId
42
+ self._targetId = targetId
43
  self.net.setPreferableBackend(self.backend_id)
 
 
 
44
  self.net.setPreferableTarget(self.target_id)
45
 
46
  def pre_process(self, img):