text: from imutils.video import VideoStream
  from monitor_dashboard.camera import VideoCamera
  from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
  from tensorflow.keras.preprocessing.image import img_to_array
  
  import cv2
  import numpy as np
  import os
  
  
  class Detector(VideoCamera):
      def __init__(self, camera_id, face_net, mask_net):
          super().__init__(camera_id)
          self.face_net = face_net
          self.mask_net = mask_net
  
  
      def get_frame(self):
          return self.detect_processing(super().get_frame())
  
  
      def detect_processing(self, image):
          (locs, preds) = self.detect_and_predict_mask(image)
          if locs is None or preds is None:
              return image
  
          for (box, pred) in zip(locs, preds):
              (startX, startY, endX, endY) = box
              (mask, withoutMask) = pred
  
              label = "Mask" if mask > withoutMask else "No Mask"
              color = (0, 255, 0) if label == "Mask" else (0, 0, 255)
                  
              label = "{}: {:.2f}%".format(label, max(mask, withoutMask) * 100)
  
              cv2.putText(image, label, (startX, startY - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.45, color, 2)
              cv2.rectangle(image, (startX, startY), (endX, endY), color, 2)
  
          return image
  
  
      def detect_and_predict_mask(self, image):
          if image is None:
              return None, None
  
          (h, w) = image.shape[:2]
          blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0))
  
          self.face_net.setInput(blob)
          detections = self.face_net.forward()
  
          faces = []
          locs = []
          preds = []
  
          for i in range(0, detections.shape[2]):
              confidence = detections[0, 0, i, 2]
  
              if confidence > 0.5:
                  box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
                  (startX, startY, endX, endY) = box.astype("int")
  
                  (startX, startY) = (max(0, startX), max(0, startY))
                  (endX, endY) = (min(w - 1, endX), min(h - 1, endY))
  
                  face = image[startY:endY, startX:endX]
                  if face.any():
                      face = cv2.cvtColor(face, cv2.COLOR_BGR2RGB)
                      face = cv2.resize(face, (224, 224))
                      face = img_to_array(face)
                      face = preprocess_input(face)
  
                      faces.append(face)
                      locs.append((startX, startY, endX, endY))
  
          if len(faces) > 0:
              faces = np.array(faces, dtype="float32")
              preds = self.mask_net.predict(faces, batch_size=32)
  
          return (locs, preds)
  