code: from imagezmq import imagezmq
  import argparse
  import numpy as np
  import tensorflow as tf
  import cv2
  import time
  
  from utils import label_map_util
  from utils import visualization_utils_color as vis_util
  
  # Path to frozen detection graph. This is the actual model that is used for the object detection.
  PATH_TO_CKPT = './model/frozen_inference_graph_face.pb'
  
  # List of the strings that is used to add correct label for each box.
  PATH_TO_LABELS = './protos/face_label_map.pbtxt'
  
  NUM_CLASSES = 2
  
  label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
  categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=NUM_CLASSES,
                                                              use_display_name=True)
  category_index = label_map_util.create_category_index(categories)
  
  
  class TensoflowFaceDector(object):
      def __init__(self, PATH_TO_CKPT):
          """Tensorflow detector
          """
  
          self.detection_graph = tf.Graph()
          with self.detection_graph.as_default():
              od_graph_def = tf.GraphDef()
              with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
                  serialized_graph = fid.read()
                  od_graph_def.ParseFromString(serialized_graph)
                  tf.import_graph_def(od_graph_def, name='')
  
          with self.detection_graph.as_default():
              config = tf.ConfigProto()
              config.gpu_options.allow_growth = True
              self.sess = tf.Session(graph=self.detection_graph, config=config)
              self.windowNotSet = True
  
      def run(self, image):
          """image: bgr image
          return (boxes, scores, classes, num_detections)
          """
  
          image_np = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
  
  
          # the array based representation of the image will be used later in order to prepare the
          # result image with boxes and labels on it.
          # Expand dimensions since the model expects images to have shape: [1, None, None, 3]
          image_np_expanded = np.expand_dims(image_np, axis=0)
          image_tensor = self.detection_graph.get_tensor_by_name('image_tensor:0')
          # Each box represents a part of the image where a particular object was detected.
          boxes = self.detection_graph.get_tensor_by_name('detection_boxes:0')
          # Each score represent how level of confidence for each of the objects.
          # Score is shown on the result image, together with the class label.
          scores = self.detection_graph.get_tensor_by_name('detection_scores:0')
          classes = self.detection_graph.get_tensor_by_name('detection_classes:0')
          num_detections = self.detection_graph.get_tensor_by_name('num_detections:0')
          # Actual detection.
          start_time = time.time()
          (boxes, scores, classes, num_detections) = self.sess.run(
              [boxes, scores, classes, num_detections],
              feed_dict={image_tensor: image_np_expanded})
          elapsed_time = time.time() - start_time
          print('inference time cost: {}'.format(elapsed_time))
  
          return (boxes, scores, classes, num_detections)
  
  def predict(model_data_path, port):
      """ starts are server"""
  
      tDetector = TensoflowFaceDector(model_data_path)
  
      # setup our server
      image_hub = imagezmq.ImageHub(open_port='tcp://*:' + port)
  
      print("Server Started on port {}..\n".format(port))
  
      while True:
          _, image = image_hub.recv_image()
  
          (boxes, scores, classes, num_detections) = tDetector.run(image)
  
          vis_util.visualize_boxes_and_labels_on_image_array(
              image,
              np.squeeze(boxes),
              np.squeeze(classes).astype(np.int32),
              np.squeeze(scores),
              category_index,
              use_normalized_coordinates=True,
              line_thickness=4)
  
          image_hub.send_image('OK', image)
  
  
  def main():
      # Parse arguments
      parser = argparse.ArgumentParser()
      parser.add_argument('--port', help='Directory of images to predict', default='5555', type=str)
  
      args = parser.parse_args()
  
      # if args.test:
      print("Starting up server..\n")
      # serversample(args.port)
      # else:
      predict(PATH_TO_CKPT, args.port)
  
  
  if __name__ == '__main__':
      main()
  
apis: numpy.squeeze tensorflow.gfile.GFile tensorflow.Graph numpy.expand_dims tensorflow.Session tensorflow.import_graph_def tensorflow.ConfigProto tensorflow.GraphDef