본문 바로가기

TIL

[TIL 2024. 05. 20] deepface 코드 수정

  • DeepFace 분석 및 내부 함수 생성: 사용하려고 하는 함수 stream()에서 우리에게 필요한 기능을 수행하는 함수는 실질적으로 perform_demography_analysis()와 analysis() 라고 판단함
    • stream() 의 return = None, analysis() 의 return = None, perform_demography_analysis() 의 return = img (np.ndarray 타입)
    • perform_demography_analysis() 함수를 수정 → 기존 np.ndarray를 return하던 함수를 나이값을 int로 return 하도록 수정
    • streaming.py의 analysis() 함수를 수정해 새 함수perform_age_analysis() 생성
      • 얼굴 인식 모델 제외
      • 카메라 화면 디스플레이 제외
      • 인식 대기 시간 2초로 단축 (기존 5초)
      • 각 if 문에서 어떤 조건에 걸리는지 test
      • 기존 return 값 None 에서 perform_demography_analysis()에서 받아온 나이를 return 하도록 함.
def perform_age_analysis(db_path: str,
    model_name="VGG-Face",
    detector_backend="opencv",
    distance_metric="cosine",
    enable_face_analysis=True,
    source=0,
    time_threshold=2,
    frame_threshold=2,):

    build_demography_models(enable_face_analysis=enable_face_analysis)

    # call a dummy find function for db_path once to create embeddings before starting webcam
    _ = search_identity(
        detected_face=np.zeros([224, 224, 3]),
        db_path=db_path,
        detector_backend=detector_backend,
        distance_metric=distance_metric,
        model_name=model_name,
    )

    freeze = False
    num_frames_with_faces = 0

    cap = cv2.VideoCapture(source)  # webcam
    while True:
        has_frame, img = cap.read()
        if not has_frame:
            print(">>>>>>>>>현재 카메라가 작동 가능하지 않습니다. 직원에게 문의해주세요.<<<<<<<<<<")

        faces_coordinates = []
        if freeze is False:
            faces_coordinates = grab_facial_areas(img=img, detector_backend=detector_backend)

            # we will pass img to analyze modules (identity, demography) and add some illustrations
            # that is why, we will not be able to extract detected face from img clearly
            detected_faces = extract_facial_areas(img=img, faces_coordinates=faces_coordinates)

            num_frames_with_faces = num_frames_with_faces + 1 if len(faces_coordinates) else 0

            freeze = num_frames_with_faces > 0 and num_frames_with_faces % frame_threshold == 0
            print(">>>>>>freeze가 False일 때: 카메라에서 벗어났을 때, 카메라가 가려져있을 때, freeze 발생 전 5초 때(time_threshold, frame_threshold = 2로 변경해서 2초) <<<<<<")

            if freeze:
                # add analyze results into img - derive from raw_img
                # img = highlight_facial_areas(img=img, faces_coordinates=faces_coordinates)

                # age, gender and emotion analysis 
                demo = perform_demography_analysis(
                    enable_face_analysis=enable_face_analysis,
                    img=img,
                    faces_coordinates=faces_coordinates,
                    detected_faces=detected_faces,
                )

                print("demo >>>>>>>>", demo)

                if demo:
                    break

    print("perform_age_analysis >>>>>>>", demo)
    return demo