deploy.py 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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 time
  18. import cv2
  19. import numpy as np
  20. import yaml
  21. from six import text_type as _text_type
  22. from paddlelite.lite import *
  23. class Predictor:
  24. def __init__(self, model_nb, model_yaml, thread_num, shape):
  25. if not osp.exists(model_nb):
  26. print("model nb file is not exists in {}".format(model_xml))
  27. self.model_nb = model_nb
  28. self.shape = shape
  29. config = MobileConfig()
  30. config.set_model_from_file(model_nb)
  31. config.set_threads(thread_num)
  32. if not osp.exists(model_yaml):
  33. print("model yaml file is not exists in {}".format(model_yaml))
  34. with open(model_yaml) as f:
  35. self.info = yaml.load(f.read(), Loader=yaml.Loader)
  36. self.model_type = self.info['_Attributes']['model_type']
  37. self.model_name = self.info['Model']
  38. self.num_classes = self.info['_Attributes']['num_classes']
  39. self.labels = self.info['_Attributes']['labels']
  40. if self.info['Model'] == 'MaskRCNN':
  41. if self.info['_init_params']['with_fpn']:
  42. self.mask_head_resolution = 28
  43. else:
  44. self.mask_head_resolution = 14
  45. transforms_mode = self.info.get('TransformsMode', 'RGB')
  46. if transforms_mode == 'RGB':
  47. to_rgb = True
  48. else:
  49. to_rgb = False
  50. self.transforms = self.build_transforms(self.info['Transforms'],
  51. to_rgb)
  52. self.predictor = create_paddle_predictor(config)
  53. self.total_time = 0
  54. self.count_num = 0
  55. def build_transforms(self, transforms_info, to_rgb=True):
  56. if self.model_type == "classifier":
  57. import transforms.cls_transforms as transforms
  58. elif self.model_type == "detector":
  59. import transforms.det_transforms as transforms
  60. elif self.model_type == "segmenter":
  61. import transforms.seg_transforms as transforms
  62. op_list = list()
  63. for op_info in transforms_info:
  64. op_name = list(op_info.keys())[0]
  65. op_attr = op_info[op_name]
  66. if not hasattr(transforms, op_name):
  67. raise Exception(
  68. "There's no operator named '{}' in transforms of {}".
  69. format(op_name, self.model_type))
  70. op_list.append(getattr(transforms, op_name)(**op_attr))
  71. eval_transforms = transforms.Compose(op_list)
  72. if hasattr(eval_transforms, 'to_rgb'):
  73. eval_transforms.to_rgb = to_rgb
  74. self.arrange_transforms(eval_transforms)
  75. return eval_transforms
  76. def arrange_transforms(self, eval_transforms):
  77. if self.model_type == 'classifier':
  78. import transforms.cls_transforms as transforms
  79. arrange_transform = transforms.ArrangeClassifier
  80. elif self.model_type == 'segmenter':
  81. import transforms.seg_transforms as transforms
  82. arrange_transform = transforms.ArrangeSegmenter
  83. elif self.model_type == 'detector':
  84. import transforms.det_transforms as transforms
  85. arrange_name = 'Arrange{}'.format(self.model_name)
  86. arrange_transform = getattr(transforms, arrange_name)
  87. else:
  88. raise Exception("Unrecognized model type: {}".format(
  89. self.model_type))
  90. if type(eval_transforms.transforms[-1]).__name__.startswith('Arrange'):
  91. eval_transforms.transforms[-1] = arrange_transform(mode='test')
  92. else:
  93. eval_transforms.transforms.append(arrange_transform(mode='test'))
  94. def raw_predict(self, preprocessed_input):
  95. self.count_num += 1
  96. input_tensor = self.predictor.get_input(0)
  97. input_tensor.resize(self.shape)
  98. input_tensor.set_float_data(preprocessed_input['image'])
  99. if self.model_name == "YOLOv3":
  100. input_size_tensor = self.predictor.get_input(1)
  101. input_size_tensor.resize([1, 2])
  102. input_size_tensor.set_float_data(preprocessed_input['im_size'])
  103. #Start inference
  104. start_time = time.time()
  105. self.predictor.run()
  106. time_use = time.time() - start_time
  107. if (self.count_num >= 20):
  108. self.total_time += time_use
  109. if (self.count_num >= 120):
  110. print("avgtime:", self.total_time * 10)
  111. #Processing output blob
  112. print("Processing output blob")
  113. return
  114. def preprocess(self, image):
  115. res = dict()
  116. if self.model_type == "classifier":
  117. im, = self.transforms(image)
  118. im = np.expand_dims(im, axis=0).copy()
  119. im = im.flatten()
  120. res['image'] = im
  121. elif self.model_type == "detector":
  122. if self.model_name == "YOLOv3":
  123. im, im_shape = self.transforms(image)
  124. im = np.expand_dims(im, axis=0).copy()
  125. im_shape = np.expand_dims(im_shape, axis=0).copy()
  126. res['image'] = im
  127. res['im_size'] = im_shape
  128. if self.model_name.count('RCNN') > 0:
  129. im, im_resize_info, im_shape = self.transforms(image)
  130. im = np.expand_dims(im, axis=0).copy()
  131. im_resize_info = np.expand_dims(im_resize_info, axis=0).copy()
  132. im_shape = np.expand_dims(im_shape, axis=0).copy()
  133. res['image'] = im
  134. res['im_info'] = im_resize_info
  135. res['im_shape'] = im_shape
  136. elif self.model_type == "segmenter":
  137. im, im_info = self.transforms(image)
  138. im = np.expand_dims(im, axis=0).copy()
  139. #np.savetxt('./input_data.txt',im.flatten())
  140. res['image'] = im
  141. res['im_info'] = im_info
  142. return res
  143. def classifier_postprocess(self, topk=1):
  144. output_tensor = self.predictor.get_output(0)
  145. output_data = output_tensor.float_data()
  146. true_topk = min(self.num_classes, topk)
  147. pred_label = np.argsort(-np.array(output_data))[:true_topk]
  148. result = [{
  149. 'category_id': l,
  150. 'category': self.labels[l],
  151. 'score': output_data[l],
  152. } for l in pred_label]
  153. print(result)
  154. return result
  155. def segmenter_postprocess(self, preprocessed_inputs):
  156. out_label_tensor = self.predictor.get_output(0)
  157. out_label = out_label_tensor.float_data()
  158. label_shape = tuple(out_label_tensor.shape())
  159. label_map = np.array(out_label).astype('uint8')
  160. label_map = label_map.reshap(label_shape)
  161. label_map = np.squeeze(label_map)
  162. out_score_tensor = self.predictor.get_output(1)
  163. out_score = out_score_tensor.float_data()
  164. score_shape = tuple(out_score_tensor.shape())
  165. score_map = np.array(out_score)
  166. score_map = score_map.reshap(score_shape)
  167. score_map = np.transpose(score_map, (1, 2, 0))
  168. im_info = preprocessed_inputs['im_info']
  169. for info in im_info[::-1]:
  170. if info[0] == 'resize':
  171. w, h = info[1][1], info[1][0]
  172. label_map = cv2.resize(label_map, (w, h), cv2.INTER_NEAREST)
  173. score_map = cv2.resize(score_map, (w, h), cv2.INTER_LINEAR)
  174. elif info[0] == 'padding':
  175. w, h = info[1][1], info[1][0]
  176. label_map = label_map[0:h, 0:w]
  177. score_map = score_map[0:h, 0:w, :]
  178. else:
  179. raise Exception("Unexpected info '{}' in im_info".format(info[
  180. 0]))
  181. return {'label_map': label_map, 'score_map': score_map}
  182. def detector_postprocess(self, preprocessed_inputs):
  183. out_tensor = self.predictor.get_output(0)
  184. out_data = out_tensor.float_data()
  185. out_shape = tuple(out_tensor.shape())
  186. out_data = np.array(out_data)
  187. outputs = label_data.reshap(out_shape)
  188. result = []
  189. for out in outputs:
  190. result.append(out.tolist())
  191. return result
  192. def predict(self, image, topk=1, threshold=0.5):
  193. preprocessed_input = self.preprocess(image)
  194. self.raw_predict(preprocessed_input)
  195. if self.model_type == "classifier":
  196. results = self.classifier_postprocess(topk)
  197. elif self.model_type == "detector":
  198. results = self.detector_postprocess(preprocessed_input)
  199. elif self.model_type == "segmenter":
  200. pass
  201. results = self.segmenter_postprocess(preprocessed_input)