deploy.py 9.2 KB

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