Python 및 OpenCV를 사용한 간단한 연령 및 성별 감지

소개



안녕하세요! 이 튜토리얼에서는 Python 및 OpenCV를 사용하여 간단한 연령 및 성별 감지기를 만드는 방법을 보여줍니다. 😃

요구 사항


  • 파이썬 3



  • 파이썬 가상 환경 생성



    Python 3을 사용하여 virtualenv를 만드는 것은 매우 간단하며 모듈 등을 설치할 필요가 없습니다.

    python3 -m venv env
    


    그런 다음 활성화하기만 하면 됩니다.

    source env/bin/activate
    


    이 예제에서는 opencv-python만 필요하므로 "requirements.txt"파일에서 정의합니다.

    opencv-python
    


    저장한 다음 다음을 통해 요구 사항을 설치합니다.

    pip install -r requirements.txt
    


    이렇게 하면 생성된 가상 환경에 opencv-python이 설치됩니다.


    필요한 모델/중량 다운로드



    이에 필요한 모델과 가중치는 다음을 통해 찾을 수 있습니다.
    https://github.com/ethand91/python-gender-age-detect/tree/master/weights

    다운로드하여 "weights"라는 디렉토리에 넣기만 하면 됩니다.

    파이썬 파일 생성



    이제 마침내 Python 작성을 시작할 수 있습니다. 먼저 필요한 모듈을 가져와야 합니다.

    1. 모듈 가져오기



    import cv2
    import math
    import sys
    

    2. 모델/가중치 파일 정의



    다음으로 모델과 가중치 등을 정의하고 로드해야 합니다.

    # Defined the model files
    FACE_PROTO = "weights/opencv_face_detector.pbtxt"
    FACE_MODEL = "weights/opencv_face_detector_uint8.pb"
    
    AGE_PROTO = "weights/age_deploy.prototxt"
    AGE_MODEL = "weights/age_net.caffemodel"
    
    GENDER_PROTO = "weights/gender_deploy.prototxt"
    GENDER_MODEL = "weights/gender_net.caffemodel"
    
    # Load network
    FACE_NET = cv2.dnn.readNet(FACE_MODEL, FACE_PROTO)
    AGE_NET = cv2.dnn.readNet(AGE_MODEL, AGE_PROTO)
    GENDER_NET = cv2.dnn.readNet(GENDER_MODEL, GENDER_PROTO)
    
    MODEL_MEAN_VALUES = (78.4263377603, 87.7689143744, 114.895847746)
    AGE_LIST = ["(0-2)", "(4-6)", "(8-12)", "(15-20)", "(25-32)", "(38-43)", "(48-53)", "(60-100)"]
    GENDER_LIST = ["Male", "Female"]
    
    box_padding = 20
    


    3. 경계 상자 좌표 얻기



    다음으로 얼굴 좌표를 가져와야 하며 다음을 통해 이미지에 사각형을 그립니다.

    def get_face_box (net, frame, conf_threshold = 0.7):
      frame_copy = frame.copy()
      frame_height = frame_copy.shape[0]
      frame_width = frame_copy.shape[1]
      blob = cv2.dnn.blobFromImage(frame_copy, 1.0, (300, 300), [104, 117, 123], True, False)
    
      net.setInput(blob)
      detections = net.forward()
      boxes = []
    
      for i in range(detections.shape[2]):
        confidence = detections[0, 0, i, 2]
    
        if confidence > conf_threshold:
          x1 = int(detections[0, 0, i, 3] * frame_width)
          y1 = int(detections[0, 0, i, 4] * frame_height)
          x2 = int(detections[0, 0, i, 5] * frame_width)
          y2 = int(detections[0, 0, i, 6] * frame_height)
          boxes.append([x1, y1, x2, y2])
          cv2.rectangle(frame_copy, (x1, y1), (x2, y2), (0, 255, 0), int(round(frame_height / 150)), 8)
    
      return frame_copy, boxes
    


    4. 연령 및 성별 예측



    다음으로 다음을 사용하여 사람의 나이와 성별을 예측하고 다음을 통해 이미지에 나이와 성별을 그립니다.

    def age_gender_detector (input_path):
      image = cv2.imread(input_path)
      resized_image = cv2.resize(image, (640, 480))
    
      frame = resized_image.copy()
      frame_face, boxes = get_face_box(FACE_NET, frame)
    
      for box in boxes:
        face = frame[max(0, box[1] - box_padding):min(box[3] + box_padding, frame.shape[0] - 1), \
          max(0, box[0] - box_padding):min(box[2] + box_padding, frame.shape[1] - 1)]
    
        blob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), MODEL_MEAN_VALUES, swapRB = False)
        GENDER_NET.setInput(blob)
        gender_predictions = GENDER_NET.forward()
        gender = GENDER_LIST[gender_predictions[0].argmax()]
        print("Gender: {}, conf: {:.3f}".format(gender, gender_predictions[0].max()))
    
        AGE_NET.setInput(blob)
        age_predictions = AGE_NET.forward()
        age = AGE_LIST[age_predictions[0].argmax()]
        print("Age: {}, conf: {:.3f}".format(age, age_predictions[0].max()))
    
        label = "{},{}".format(gender, age)
        cv2.putText(frame_face, label, (box[0], box[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2, cv2.LINE_AA)
    
      return frame_face
    


    5. 메인 쓰기



    마지막으로 프로그램의 시작점을 작성합니다.

    if __name__ == "__main__":
      output = age_gender_detector(sys.argv[1])
      cv2.imwrite("output/output.jpg", output)
      cv2.imshow("Output", output)
    
      cv2.waitKey(0)
      cv2.destroyAllWindows()
    


    여기서 파일 경로를 argv[1]로 가져오고 이미지에 있는 사람들의 나이와 성별을 예측합니다.
    출력은 출력 디렉터리에도 기록됩니다(실행하기 전에 이 디렉터리를 생성해야 할 수 있음).

    그런 다음 사용자가 아무 키나 누를 때까지 출력이 사용자에게 표시됩니다.
    사용 예:

    python main.py lena.jpg
    


    모든 것이 잘 진행되면 다음이 표시되어야 합니다.



    다양한 이미지로 자유롭게 시도해보세요.

    Github 레포:
    https://github.com/ethand91/python-gender-age-detect


    내가 일하는 것처럼? 다양한 주제에 대해 포스팅하고 있으니 더 보고 싶으시면 좋아요와 팔로우 부탁드립니다.
    또한 저는 커피를 좋아합니다.

    좋은 웹페이지 즐겨찾기