deploy.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. import sys
  15. import os
  16. import os.path as osp
  17. import time
  18. import cv2
  19. import numpy as np
  20. import yaml
  21. from six import text_type as _text_type
  22. from openvino.inference_engine import IECore
  23. class Predictor:
  24. def __init__(self, model_xml, model_yaml, device="CPU"):
  25. self.device = device
  26. if not osp.exists(model_xml):
  27. print("model xml file is not exists in {}".format(model_xml))
  28. self.model_xml = model_xml
  29. self.model_bin = osp.splitext(model_xml)[0] + ".bin"
  30. if not osp.exists(model_yaml):
  31. print("model yaml file is not exists in {}".format(model_yaml))
  32. with open(model_yaml) as f:
  33. self.info = yaml.load(f.read(), Loader=yaml.Loader)
  34. self.model_type = self.info['_Attributes']['model_type']
  35. self.model_name = self.info['Model']
  36. self.num_classes = self.info['_Attributes']['num_classes']
  37. self.labels = self.info['_Attributes']['labels']
  38. if self.info['Model'] == 'MaskRCNN':
  39. if self.info['_init_params']['with_fpn']:
  40. self.mask_head_resolution = 28
  41. else:
  42. self.mask_head_resolution = 14
  43. transforms_mode = self.info.get('TransformsMode', 'RGB')
  44. if transforms_mode == 'RGB':
  45. to_rgb = True
  46. else:
  47. to_rgb = False
  48. self.transforms = self.build_transforms(self.info['Transforms'],
  49. to_rgb)
  50. self.predictor, self.net = self.create_predictor()
  51. self.total_time = 0
  52. self.count_num = 0
  53. def create_predictor(self):
  54. #initialization for specified device
  55. print("Creating Inference Engine")
  56. ie = IECore()
  57. print("Loading network files:\n\t{}\n\t{}".format(self.model_xml,
  58. self.model_bin))
  59. net = ie.read_network(model=self.model_xml, weights=self.model_bin)
  60. net.batch_size = 1
  61. network_config = {}
  62. if self.device == "MYRIAD":
  63. network_config = {'VPU_HW_STAGES_OPTIMIZATION': 'NO'}
  64. exec_net = ie.load_network(
  65. network=net, device_name=self.device, config=network_config)
  66. return exec_net, net
  67. def build_transforms(self, transforms_info, to_rgb=True):
  68. if self.model_type == "classifier":
  69. import transforms.cls_transforms as transforms
  70. elif self.model_type == "detector":
  71. import transforms.det_transforms as transforms
  72. elif self.model_type == "segmenter":
  73. import transforms.seg_transforms as transforms
  74. op_list = list()
  75. for op_info in transforms_info:
  76. op_name = list(op_info.keys())[0]
  77. op_attr = op_info[op_name]
  78. if not hasattr(transforms, op_name):
  79. raise Exception(
  80. "There's no operator named '{}' in transforms of {}".
  81. format(op_name, self.model_type))
  82. op_list.append(getattr(transforms, op_name)(**op_attr))
  83. eval_transforms = transforms.Compose(op_list)
  84. if hasattr(eval_transforms, 'to_rgb'):
  85. eval_transforms.to_rgb = to_rgb
  86. self.arrange_transforms(eval_transforms)
  87. return eval_transforms
  88. def arrange_transforms(self, eval_transforms):
  89. if self.model_type == 'classifier':
  90. import transforms.cls_transforms as transforms
  91. arrange_transform = transforms.ArrangeClassifier
  92. elif self.model_type == 'segmenter':
  93. import transforms.seg_transforms as transforms
  94. arrange_transform = transforms.ArrangeSegmenter
  95. elif self.model_type == 'detector':
  96. import transforms.det_transforms as transforms
  97. arrange_name = 'Arrange{}'.format(self.model_name)
  98. arrange_transform = getattr(transforms, arrange_name)
  99. else:
  100. raise Exception("Unrecognized model type: {}".format(
  101. self.model_type))
  102. if type(eval_transforms.transforms[-1]).__name__.startswith('Arrange'):
  103. eval_transforms.transforms[-1] = arrange_transform(mode='test')
  104. else:
  105. eval_transforms.transforms.append(arrange_transform(mode='test'))
  106. def raw_predict(self, preprocessed_input):
  107. self.count_num += 1
  108. feed_dict = {}
  109. if self.model_name == "YOLOv3":
  110. inputs = self.net.inputs
  111. for name in inputs:
  112. if (len(inputs[name].shape) == 2):
  113. feed_dict[name] = preprocessed_input['im_size']
  114. elif (len(inputs[name].shape) == 4):
  115. feed_dict[name] = preprocessed_input['image']
  116. else:
  117. pass
  118. else:
  119. input_blob = next(iter(self.net.inputs))
  120. feed_dict[input_blob] = preprocessed_input['image']
  121. #Start sync inference
  122. print("Starting inference in synchronous mode")
  123. res = self.predictor.infer(inputs=feed_dict)
  124. #Processing output blob
  125. print("Processing output blob")
  126. return res
  127. def preprocess(self, image):
  128. res = dict()
  129. if self.model_type == "classifier":
  130. im, = self.transforms(image)
  131. im = np.expand_dims(im, axis=0).copy()
  132. res['image'] = im
  133. elif self.model_type == "detector":
  134. if self.model_name == "YOLOv3":
  135. im, im_shape = self.transforms(image)
  136. im = np.expand_dims(im, axis=0).copy()
  137. im_shape = np.expand_dims(im_shape, axis=0).copy()
  138. res['image'] = im
  139. res['im_size'] = im_shape
  140. if self.model_name.count('RCNN') > 0:
  141. im, im_resize_info, im_shape = self.transforms(image)
  142. im = np.expand_dims(im, axis=0).copy()
  143. im_resize_info = np.expand_dims(im_resize_info, axis=0).copy()
  144. im_shape = np.expand_dims(im_shape, axis=0).copy()
  145. res['image'] = im
  146. res['im_info'] = im_resize_info
  147. res['im_shape'] = im_shape
  148. elif self.model_type == "segmenter":
  149. im, im_info = self.transforms(image)
  150. im = np.expand_dims(im, axis=0).copy()
  151. res['image'] = im
  152. res['im_info'] = im_info
  153. return res
  154. def classifier_postprocess(self, preds, topk=1):
  155. """ 对分类模型的预测结果做后处理
  156. """
  157. true_topk = min(self.num_classes, topk)
  158. output_name = next(iter(self.net.outputs))
  159. pred_label = np.argsort(-preds[output_name][0])[:true_topk]
  160. result = [{
  161. 'category_id': l,
  162. 'category': self.labels[l],
  163. 'score': preds[output_name][0][l],
  164. } for l in pred_label]
  165. print(result)
  166. return result
  167. def segmenter_postprocess(self, preds, preprocessed_inputs):
  168. """ 对语义分割结果做后处理
  169. """
  170. it = iter(self.net.outputs)
  171. next(it)
  172. score_name = next(it)
  173. score_map = np.squeeze(preds[score_name])
  174. score_map = np.transpose(score_map, (1, 2, 0))
  175. label_name = next(it)
  176. label_map = np.squeeze(preds[label_name]).astype('uint8')
  177. im_info = preprocessed_inputs['im_info']
  178. for info in im_info[::-1]:
  179. if info[0] == 'resize':
  180. w, h = info[1][1], info[1][0]
  181. label_map = cv2.resize(label_map, (w, h), cv2.INTER_NEAREST)
  182. score_map = cv2.resize(score_map, (w, h), cv2.INTER_LINEAR)
  183. elif info[0] == 'padding':
  184. w, h = info[1][1], info[1][0]
  185. label_map = label_map[0:h, 0:w]
  186. score_map = score_map[0:h, 0:w, :]
  187. else:
  188. raise Exception("Unexpected info '{}' in im_info".format(info[
  189. 0]))
  190. return {'label_map': label_map, 'score_map': score_map}
  191. def detector_postprocess(self, preds, preprocessed_inputs):
  192. """对图像检测结果做后处理
  193. """
  194. output_name = next(iter(self.net.outputs))
  195. outputs = preds[output_name][0]
  196. result = []
  197. for out in outputs:
  198. if (out[0] > 0):
  199. result.append(out.tolist())
  200. else:
  201. pass
  202. print(result)
  203. return result
  204. def predict(self, image, topk=1, threshold=0.5):
  205. preprocessed_input = self.preprocess(image)
  206. model_pred = self.raw_predict(preprocessed_input)
  207. if self.model_type == "classifier":
  208. results = self.classifier_postprocess(model_pred, topk)
  209. elif self.model_type == "detector":
  210. results = self.detector_postprocess(model_pred, preprocessed_input)
  211. elif self.model_type == "segmenter":
  212. results = self.segmenter_postprocess(model_pred,
  213. preprocessed_input)