Add model file collector, fix some bugs and add some features (#123)
Browse filesadd model path searcher and remove hardwritten file paths from benchmark configs; pack ppresnet, mobilenet & crnn with labels; fix palm det data; add flags to enable models of different precision separately (#123)
- demo.py +11 -14
- imagenet_labels.txt → mobilenet.py +81 -2
- mobilenet_v1.py +0 -81
- mobilenet_v2.py +0 -81
demo.py
CHANGED
|
@@ -3,8 +3,7 @@ import argparse
|
|
| 3 |
import numpy as np
|
| 4 |
import cv2 as cv
|
| 5 |
|
| 6 |
-
from
|
| 7 |
-
from mobilenet_v2 import MobileNetV2
|
| 8 |
|
| 9 |
def str2bool(v):
|
| 10 |
if v.lower() in ['on', 'yes', 'true', 'y', 't']:
|
|
@@ -26,24 +25,23 @@ try:
|
|
| 26 |
except:
|
| 27 |
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.')
|
| 28 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
parser = argparse.ArgumentParser(description='Demo for MobileNet V1 & V2.')
|
| 30 |
parser.add_argument('--input', '-i', type=str, help='Usage: Set input path to a certain image, omit if using camera.')
|
| 31 |
-
parser.add_argument('--model', '-m', type=str, choices=
|
| 32 |
parser.add_argument('--backend', '-b', type=int, default=backends[0], help=help_msg_backends.format(*backends))
|
| 33 |
parser.add_argument('--target', '-t', type=int, default=targets[0], help=help_msg_targets.format(*targets))
|
| 34 |
-
parser.add_argument('--label', '-l', type=str, default='./imagenet_labels.txt', help='Usage: Set path to the different labels that will be used during the detection. Default list found in imagenet_labels.txt')
|
| 35 |
args = parser.parse_args()
|
| 36 |
|
| 37 |
if __name__ == '__main__':
|
| 38 |
-
# Instantiate
|
| 39 |
-
|
| 40 |
-
'v1': MobileNetV1(modelPath='./image_classification_mobilenetv1_2022apr.onnx', labelPath=args.label, backendId=args.backend, targetId=args.target),
|
| 41 |
-
'v2': MobileNetV2(modelPath='./image_classification_mobilenetv2_2022apr.onnx', labelPath=args.label, backendId=args.backend, targetId=args.target),
|
| 42 |
-
'v1-q': MobileNetV1(modelPath='./image_classification_mobilenetv1_2022apr-int8-quantized.onnx', labelPath=args.label, backendId=args.backend, targetId=args.target),
|
| 43 |
-
'v2-q': MobileNetV2(modelPath='./image_classification_mobilenetv2_2022apr-int8-quantized.onnx', labelPath=args.label, backendId=args.backend, targetId=args.target)
|
| 44 |
-
|
| 45 |
-
}
|
| 46 |
-
model = models[args.model]
|
| 47 |
|
| 48 |
# Read image and get a 224x224 crop from a 256x256 resized
|
| 49 |
image = cv.imread(args.input)
|
|
@@ -56,4 +54,3 @@ if __name__ == '__main__':
|
|
| 56 |
|
| 57 |
# Print result
|
| 58 |
print('label: {}'.format(result))
|
| 59 |
-
|
|
|
|
| 3 |
import numpy as np
|
| 4 |
import cv2 as cv
|
| 5 |
|
| 6 |
+
from mobilenet import MobileNet
|
|
|
|
| 7 |
|
| 8 |
def str2bool(v):
|
| 9 |
if v.lower() in ['on', 'yes', 'true', 'y', 't']:
|
|
|
|
| 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 |
+
all_mobilenets = [
|
| 29 |
+
'image_classification_mobilenetv1_2022apr.onnx',
|
| 30 |
+
'image_classification_mobilenetv2_2022apr.onnx',
|
| 31 |
+
'image_classification_mobilenetv1_2022apr-int8-quantized.onnx',
|
| 32 |
+
'image_classification_mobilenetv2_2022apr-int8-quantized.onnx'
|
| 33 |
+
]
|
| 34 |
+
|
| 35 |
parser = argparse.ArgumentParser(description='Demo for MobileNet V1 & V2.')
|
| 36 |
parser.add_argument('--input', '-i', type=str, help='Usage: Set input path to a certain image, omit if using camera.')
|
| 37 |
+
parser.add_argument('--model', '-m', type=str, choices=all_mobilenets, default=all_mobilenets[0], help='Usage: Set model type, defaults to image_classification_mobilenetv1_2022apr.onnx (v1).')
|
| 38 |
parser.add_argument('--backend', '-b', type=int, default=backends[0], help=help_msg_backends.format(*backends))
|
| 39 |
parser.add_argument('--target', '-t', type=int, default=targets[0], help=help_msg_targets.format(*targets))
|
|
|
|
| 40 |
args = parser.parse_args()
|
| 41 |
|
| 42 |
if __name__ == '__main__':
|
| 43 |
+
# Instantiate MobileNet
|
| 44 |
+
model = MobileNet(modelPath=args.model, backendId=args.backend, targetId=args.target)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
|
| 46 |
# Read image and get a 224x224 crop from a 256x256 resized
|
| 47 |
image = cv.imread(args.input)
|
|
|
|
| 54 |
|
| 55 |
# Print result
|
| 56 |
print('label: {}'.format(result))
|
|
|
imagenet_labels.txt → mobilenet.py
RENAMED
|
@@ -1,4 +1,83 @@
|
|
| 1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
goldfish
|
| 3 |
great white shark
|
| 4 |
tiger shark
|
|
@@ -997,4 +1076,4 @@ earthstar
|
|
| 997 |
hen-of-the-woods
|
| 998 |
bolete
|
| 999 |
ear
|
| 1000 |
-
toilet tissue
|
|
|
|
| 1 |
+
import numpy as np
|
| 2 |
+
import cv2 as cv
|
| 3 |
+
|
| 4 |
+
class MobileNet:
|
| 5 |
+
'''
|
| 6 |
+
Works with MobileNet V1 & V2.
|
| 7 |
+
'''
|
| 8 |
+
|
| 9 |
+
def __init__(self, modelPath, topK=1, backendId=0, targetId=0):
|
| 10 |
+
self.model_path = modelPath
|
| 11 |
+
assert topK >= 1
|
| 12 |
+
self.top_k = topK
|
| 13 |
+
self.backend_id = backendId
|
| 14 |
+
self.target_id = targetId
|
| 15 |
+
|
| 16 |
+
self.model = cv.dnn.readNet(self.model_path)
|
| 17 |
+
self.model.setPreferableBackend(self.backend_id)
|
| 18 |
+
self.model.setPreferableTarget(self.target_id)
|
| 19 |
+
|
| 20 |
+
self.input_names = ''
|
| 21 |
+
self.output_names = ''
|
| 22 |
+
self.input_size = [224, 224]
|
| 23 |
+
self.mean=[0.485, 0.456, 0.406]
|
| 24 |
+
self.std=[0.229, 0.224, 0.225]
|
| 25 |
+
|
| 26 |
+
# load labels
|
| 27 |
+
self._labels = self._load_labels()
|
| 28 |
+
|
| 29 |
+
def _load_labels(self):
|
| 30 |
+
return self.LABELS_IMAGENET_1K.splitlines()
|
| 31 |
+
|
| 32 |
+
@property
|
| 33 |
+
def name(self):
|
| 34 |
+
return self.__class__.__name__
|
| 35 |
+
|
| 36 |
+
def setBackend(self, backendId):
|
| 37 |
+
self.backend_id = backendId
|
| 38 |
+
self.model.setPreferableBackend(self.backend_id)
|
| 39 |
+
|
| 40 |
+
def setTarget(self, targetId):
|
| 41 |
+
self.target_id = targetId
|
| 42 |
+
self.model.setPreferableTarget(self.target_id)
|
| 43 |
+
|
| 44 |
+
def _preprocess(self, image):
|
| 45 |
+
input_blob = (image / 255.0 - self.mean) / self.std
|
| 46 |
+
input_blob = input_blob.transpose(2, 0, 1)
|
| 47 |
+
input_blob = input_blob[np.newaxis, :, :, :]
|
| 48 |
+
input_blob = input_blob.astype(np.float32)
|
| 49 |
+
return input_blob
|
| 50 |
+
|
| 51 |
+
def infer(self, image):
|
| 52 |
+
# Preprocess
|
| 53 |
+
input_blob = self._preprocess(image)
|
| 54 |
+
|
| 55 |
+
# Forward
|
| 56 |
+
self.model.setInput(input_blob, self.input_names)
|
| 57 |
+
output_blob = self.model.forward(self.output_names)
|
| 58 |
+
|
| 59 |
+
# Postprocess
|
| 60 |
+
results = self._postprocess(output_blob)
|
| 61 |
+
|
| 62 |
+
return results
|
| 63 |
+
|
| 64 |
+
def _postprocess(self, output_blob):
|
| 65 |
+
batched_class_id_list = []
|
| 66 |
+
for o in output_blob:
|
| 67 |
+
class_id_list = o.argsort()[::-1][:self.top_k]
|
| 68 |
+
batched_class_id_list.append(class_id_list)
|
| 69 |
+
if len(self._labels) > 0:
|
| 70 |
+
batched_predicted_labels = []
|
| 71 |
+
for class_id_list in batched_class_id_list:
|
| 72 |
+
predicted_labels = []
|
| 73 |
+
for class_id in class_id_list:
|
| 74 |
+
predicted_labels.append(self._labels[class_id])
|
| 75 |
+
batched_predicted_labels.append(predicted_labels)
|
| 76 |
+
return batched_predicted_labels
|
| 77 |
+
else:
|
| 78 |
+
return batched_class_id_list
|
| 79 |
+
|
| 80 |
+
LABELS_IMAGENET_1K = '''tench
|
| 81 |
goldfish
|
| 82 |
great white shark
|
| 83 |
tiger shark
|
|
|
|
| 1076 |
hen-of-the-woods
|
| 1077 |
bolete
|
| 1078 |
ear
|
| 1079 |
+
toilet tissue'''
|
mobilenet_v1.py
DELETED
|
@@ -1,81 +0,0 @@
|
|
| 1 |
-
import numpy as np
|
| 2 |
-
import cv2 as cv
|
| 3 |
-
|
| 4 |
-
class MobileNetV1:
|
| 5 |
-
def __init__(self, modelPath, labelPath=None, topK=1, backendId=0, targetId=0):
|
| 6 |
-
self.model_path = modelPath
|
| 7 |
-
self.label_path = labelPath
|
| 8 |
-
assert topK >= 1
|
| 9 |
-
self.top_k = topK
|
| 10 |
-
self.backend_id = backendId
|
| 11 |
-
self.target_id = targetId
|
| 12 |
-
|
| 13 |
-
self.model = cv.dnn.readNet(self.model_path)
|
| 14 |
-
self.model.setPreferableBackend(self.backend_id)
|
| 15 |
-
self.model.setPreferableTarget(self.target_id)
|
| 16 |
-
|
| 17 |
-
self.input_names = ''
|
| 18 |
-
self.output_names = ''
|
| 19 |
-
self.input_size = [224, 224]
|
| 20 |
-
self.mean=[0.485, 0.456, 0.406]
|
| 21 |
-
self.std=[0.229, 0.224, 0.225]
|
| 22 |
-
|
| 23 |
-
# load labels
|
| 24 |
-
self._labels = self._load_labels()
|
| 25 |
-
|
| 26 |
-
def _load_labels(self):
|
| 27 |
-
labels = []
|
| 28 |
-
if self.label_path is not None:
|
| 29 |
-
with open(self.label_path, 'r') as f:
|
| 30 |
-
for line in f:
|
| 31 |
-
labels.append(line.strip())
|
| 32 |
-
return labels
|
| 33 |
-
|
| 34 |
-
@property
|
| 35 |
-
def name(self):
|
| 36 |
-
return self.__class__.__name__
|
| 37 |
-
|
| 38 |
-
def setBackend(self, backendId):
|
| 39 |
-
self.backend_id = backendId
|
| 40 |
-
self.model.setPreferableBackend(self.backend_id)
|
| 41 |
-
|
| 42 |
-
def setTarget(self, targetId):
|
| 43 |
-
self.target_id = targetId
|
| 44 |
-
self.model.setPreferableTarget(self.target_id)
|
| 45 |
-
|
| 46 |
-
def _preprocess(self, image):
|
| 47 |
-
input_blob = (image / 255.0 - self.mean) / self.std
|
| 48 |
-
input_blob = input_blob.transpose(2, 0, 1)
|
| 49 |
-
input_blob = input_blob[np.newaxis, :, :, :]
|
| 50 |
-
input_blob = input_blob.astype(np.float32)
|
| 51 |
-
return input_blob
|
| 52 |
-
|
| 53 |
-
def infer(self, image):
|
| 54 |
-
# Preprocess
|
| 55 |
-
input_blob = self._preprocess(image)
|
| 56 |
-
|
| 57 |
-
# Forward
|
| 58 |
-
self.model.setInput(input_blob, self.input_names)
|
| 59 |
-
output_blob = self.model.forward(self.output_names)
|
| 60 |
-
|
| 61 |
-
# Postprocess
|
| 62 |
-
results = self._postprocess(output_blob)
|
| 63 |
-
|
| 64 |
-
return results
|
| 65 |
-
|
| 66 |
-
def _postprocess(self, output_blob):
|
| 67 |
-
batched_class_id_list = []
|
| 68 |
-
for o in output_blob:
|
| 69 |
-
class_id_list = o.argsort()[::-1][:self.top_k]
|
| 70 |
-
batched_class_id_list.append(class_id_list)
|
| 71 |
-
if len(self._labels) > 0:
|
| 72 |
-
batched_predicted_labels = []
|
| 73 |
-
for class_id_list in batched_class_id_list:
|
| 74 |
-
predicted_labels = []
|
| 75 |
-
for class_id in class_id_list:
|
| 76 |
-
predicted_labels.append(self._labels[class_id])
|
| 77 |
-
batched_predicted_labels.append(predicted_labels)
|
| 78 |
-
return batched_predicted_labels
|
| 79 |
-
else:
|
| 80 |
-
return batched_class_id_list
|
| 81 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mobilenet_v2.py
DELETED
|
@@ -1,81 +0,0 @@
|
|
| 1 |
-
import numpy as np
|
| 2 |
-
import cv2 as cv
|
| 3 |
-
|
| 4 |
-
class MobileNetV2:
|
| 5 |
-
def __init__(self, modelPath, labelPath=None, topK=1, backendId=0, targetId=0):
|
| 6 |
-
self.model_path = modelPath
|
| 7 |
-
self.label_path = labelPath
|
| 8 |
-
assert topK >= 1
|
| 9 |
-
self.top_k = topK
|
| 10 |
-
self.backend_id = backendId
|
| 11 |
-
self.target_id = targetId
|
| 12 |
-
|
| 13 |
-
self.model = cv.dnn.readNet(self.model_path)
|
| 14 |
-
self.model.setPreferableBackend(self.backend_id)
|
| 15 |
-
self.model.setPreferableTarget(self.target_id)
|
| 16 |
-
|
| 17 |
-
self.input_names = ''
|
| 18 |
-
self.output_names = ''
|
| 19 |
-
self.input_size = [224, 224]
|
| 20 |
-
self.mean=[0.485, 0.456, 0.406]
|
| 21 |
-
self.std=[0.229, 0.224, 0.225]
|
| 22 |
-
|
| 23 |
-
# load labels
|
| 24 |
-
self._labels = self._load_labels()
|
| 25 |
-
|
| 26 |
-
def _load_labels(self):
|
| 27 |
-
labels = []
|
| 28 |
-
if self.label_path is not None:
|
| 29 |
-
with open(self.label_path, 'r') as f:
|
| 30 |
-
for line in f:
|
| 31 |
-
labels.append(line.strip())
|
| 32 |
-
return labels
|
| 33 |
-
|
| 34 |
-
@property
|
| 35 |
-
def name(self):
|
| 36 |
-
return self.__class__.__name__
|
| 37 |
-
|
| 38 |
-
def setBackend(self, backendId):
|
| 39 |
-
self.backend_id = backendId
|
| 40 |
-
self.model.setPreferableBackend(self.backend_id)
|
| 41 |
-
|
| 42 |
-
def setTarget(self, targetId):
|
| 43 |
-
self.target_id = targetId
|
| 44 |
-
self.model.setPreferableTarget(self.target_id)
|
| 45 |
-
|
| 46 |
-
def _preprocess(self, image):
|
| 47 |
-
input_blob = (image / 255.0 - self.mean) / self.std
|
| 48 |
-
input_blob = input_blob.transpose(2, 0, 1)
|
| 49 |
-
input_blob = input_blob[np.newaxis, :, :, :]
|
| 50 |
-
input_blob = input_blob.astype(np.float32)
|
| 51 |
-
return input_blob
|
| 52 |
-
|
| 53 |
-
def infer(self, image):
|
| 54 |
-
# Preprocess
|
| 55 |
-
input_blob = self._preprocess(image)
|
| 56 |
-
|
| 57 |
-
# Forward
|
| 58 |
-
self.model.setInput(input_blob, self.input_names)
|
| 59 |
-
output_blob = self.model.forward(self.output_names)
|
| 60 |
-
|
| 61 |
-
# Postprocess
|
| 62 |
-
results = self._postprocess(output_blob)
|
| 63 |
-
|
| 64 |
-
return results
|
| 65 |
-
|
| 66 |
-
def _postprocess(self, output_blob):
|
| 67 |
-
batched_class_id_list = []
|
| 68 |
-
for o in output_blob:
|
| 69 |
-
class_id_list = o.argsort()[::-1][:self.top_k]
|
| 70 |
-
batched_class_id_list.append(class_id_list)
|
| 71 |
-
if len(self._labels) > 0:
|
| 72 |
-
batched_predicted_labels = []
|
| 73 |
-
for class_id_list in batched_class_id_list:
|
| 74 |
-
predicted_labels = []
|
| 75 |
-
for class_id in class_id_list:
|
| 76 |
-
predicted_labels.append(self._labels[class_id])
|
| 77 |
-
batched_predicted_labels.append(predicted_labels)
|
| 78 |
-
return batched_predicted_labels
|
| 79 |
-
else:
|
| 80 |
-
return batched_class_id_list
|
| 81 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|