def process_video(video_path, outdir): vision_object = Vision(mode="only_detect") video_name = FileUtils.get_file_name(video_path) logging.info("Starting process video: {}".format(video_name)) st_time = time.time() saved_faces = 0 processed_frames = 0 fvs = FileVideoStream(video_path, preload_size=256, start=True) check_frame = 0 delay_frame = 7 while fvs.has_next(): frame = fvs.get_next() processed_frames += 1 if processed_frames - check_frame < delay_frame: continue check_frame = processed_frames faces = vision_object.face_detector(frame) for face in faces: x, y, w, h = face img_face = frame[y:y+h, x:x+w] out_path = os.path.join(outdir, "{}.jpg".format(time.time())) cv2.imwrite(out_path, img_face) saved_faces += 1 elapsed_time = time.time() - st_time std_et = std_delta_time(int(elapsed_time)) logging.info("Process {} in {} - processed_frames/total_frames {}/{} - Saved Faces {} - Avg FPS: {}".format(video_name, std_et, processed_frames, fvs.total_frames, saved_faces, int(processed_frames/elapsed_time)))
class FaceDetectionWorker: def __init__(self): self.RUNNING = True self.vision_object = Vision(mode='only_detect') self.multi_tracker = MultiTracker() self.sid = vision_config.SERVICE_TOKEN self.reg = vision_config.SERVICE_REGISTER_WORKER self.idworker = str(uuid.uuid4()) logging.info('Worker:: {}'.format(self.idworker)) self.rd = redis.StrictRedis(host='localhost', port=6379) self.ps = self.rd.pubsub() def register_work_service(self): self.rd.lpush(self.reg, self.idworker) st = time.time() while self.rd.exists(self.idworker) == False: if time.time() - st > 10.: logging.info('Wait too long!!!') return time.sleep(0.1) msg = self.rd.get(self.idworker) if msg is None or msg == b'NONE': logging.info('Server is busy!') self.rd.delete(self.idworker) self.RUNNING = False return info = msg.split() self.IN = info[0] self.OUT = info[1] self.CHANNEL = info[2] self.ps.subscribe(self.CHANNEL) logging.info('Connected to server :: {} :: {} :: {}'.format( self.IN, self.OUT, self.CHANNEL)) def run_service(self): logging.info('Detection service is running ...') while self.RUNNING: msg = self.rd.rpop(self.IN) if msg is not None: # shape_buffer = msg[:6] frame_buffer = msg # shape = np.frombuffer(shape_buffer, dtype=np.uint16) frame = np.frombuffer(frame_buffer, dtype=np.uint8) frame = cv2.imdecode(frame, cv2.IMREAD_COLOR) # frame = np.reshape(frame, (shape[0], shape[1], shape[2])) face = self.vision_object.face_detector(frame) face = np.array(face, dtype=np.uint16) self.rd.set(self.OUT, face.tobytes()) time.sleep(0.001) # if __name__ == '__main__': # worker = FaceDetectionWorker() # worker.register_work_service() # worker.run_service()