예제 #1
0
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)))
예제 #2
0
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()