deploy.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. # copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve.
  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 cv2
  18. import numpy as np
  19. import yaml
  20. from six import text_type as _text_type
  21. from openvino.inference_engine import IECore
  22. from utils import logging
  23. class Predictor:
  24. def __init__(self,
  25. model_xml,
  26. model_yaml,
  27. device="CPU"):
  28. self.device = device
  29. if not osp.exists(model_xml):
  30. logging.error("model xml file is not exists in {}".format(model_xml))
  31. self.model_xml = model_xml
  32. self.model_bin = osp.splitext(model_xml)[0] + ".bin"
  33. if not osp.exists(model_yaml):
  34. logging,error("model yaml file is not exists in {}".format(model_yaml))
  35. with open(model_yaml) as f:
  36. self.info = yaml.load(f.read(), Loader=yaml.Loader)
  37. self.model_type = self.info['_Attributes']['model_type']
  38. self.model_name = self.info['Model']
  39. self.num_classes = self.info['_Attributes']['num_classes']
  40. self.labels = self.info['_Attributes']['labels']
  41. if self.info['Model'] == 'MaskRCNN':
  42. if self.info['_init_params']['with_fpn']:
  43. self.mask_head_resolution = 28
  44. else:
  45. self.mask_head_resolution = 14
  46. transforms_mode = self.info.get('TransformsMode', 'RGB')
  47. if transforms_mode == 'RGB':
  48. to_rgb = True
  49. else:
  50. to_rgb = False
  51. self.transforms = self.build_transforms(self.info['Transforms'], to_rgb)
  52. self.predictor, self.net = self.create_predictor()
  53. def create_predictor(self):
  54. #initialization for specified device
  55. logging.info("Creating Inference Engine")
  56. ie = IECore()
  57. logging.info("Loading network files:\n\t{}\n\t{}".format(self.model_xml, self.model_bin))
  58. net = ie.read_network(model=self.model_xml, weights=self.model_bin)
  59. net.batch_size = 1
  60. exec_net = ie.load_network(network=net, device_name=self.device)
  61. return exec_net, net
  62. def build_transforms(self, transforms_info, to_rgb=True):
  63. if self.model_type == "classifier":
  64. import transforms.cls_transforms as transforms
  65. elif self.model_type == "detector":
  66. import transforms.det_transforms as transforms
  67. elif self.model_type == "segmenter":
  68. import transforms.seg_transforms as transforms
  69. op_list = list()
  70. for op_info in transforms_info:
  71. op_name = list(op_info.keys())[0]
  72. op_attr = op_info[op_name]
  73. if not hasattr(transforms, op_name):
  74. raise Exception(
  75. "There's no operator named '{}' in transforms of {}".
  76. format(op_name, self.model_type))
  77. op_list.append(getattr(transforms, op_name)(**op_attr))
  78. eval_transforms = transforms.Compose(op_list)
  79. if hasattr(eval_transforms, 'to_rgb'):
  80. eval_transforms.to_rgb = to_rgb
  81. self.arrange_transforms(eval_transforms)
  82. return eval_transforms
  83. def arrange_transforms(self, eval_transforms):
  84. if self.model_type == 'classifier':
  85. import transforms.cls_transforms as transforms
  86. arrange_transform = transforms.ArrangeClassifier
  87. elif self.model_type == 'segmenter':
  88. import transforms.det_transforms as transforms
  89. arrange_transform = transforms.ArrangeSegmenter
  90. elif self.model_type == 'detector':
  91. import transforms.seg_transforms as transforms
  92. arrange_name = 'Arrange{}'.format(self.model_name)
  93. arrange_transform = getattr(transforms, arrange_name)
  94. else:
  95. raise Exception("Unrecognized model type: {}".format(
  96. self.model_type))
  97. if type(eval_transforms.transforms[-1]).__name__.startswith('Arrange'):
  98. eval_transforms.transforms[-1] = arrange_transform(mode='test')
  99. else:
  100. eval_transforms.transforms.append(arrange_transform(mode='test'))
  101. def raw_predict(self, images):
  102. input_blob = next(iter(self.net.inputs))
  103. out_blob = next(iter(self.net.outputs))
  104. #Start sync inference
  105. logging.info("Starting inference in synchronous mode")
  106. res = self.predictor.infer(inputs={input_blob:images})
  107. #Processing output blob
  108. logging.info("Processing output blob")
  109. res = res[out_blob]
  110. print("res: ",res)
  111. def preprocess(self, image):
  112. if self.model_type == "classifier":
  113. im, = self.transforms(image)
  114. im = np.expand_dims(im, axis=0).copy()
  115. #res['image'] = im
  116. '''elif self.model_type == "detector":
  117. if self.model_name == "YOLOv3":
  118. im, im_shape = self.transforms(image)
  119. im = np.expand_dims(im, axis=0).copy()
  120. im_shape = np.expand_dims(im_shape, axis=0).copy()
  121. res['image'] = im
  122. res['im_size'] = im_shape
  123. if self.model_name.count('RCNN') > 0:
  124. im, im_resize_info, im_shape = self.transforms(image)
  125. im = np.expand_dims(im, axis=0).copy()
  126. im_resize_info = np.expand_dims(im_resize_info, axis=0).copy()
  127. im_shape = np.expand_dims(im_shape, axis=0).copy()
  128. res['image'] = im
  129. res['im_info'] = im_resize_info
  130. res['im_shape'] = im_shape
  131. elif self.model_type == "segmenter":
  132. im, im_info = self.transforms(image)
  133. im = np.expand_dims(im, axis=0).copy()
  134. res['image'] = im
  135. res['im_info'] = im_info'''
  136. return im
  137. def predict(self, image, topk=1, threshold=0.5):
  138. preprocessed_input = self.preprocess(image)
  139. model_pred = self.raw_predict(preprocessed_input)