메뉴 건너뛰기

컴퓨터비전 및 그래픽스 실습

# 디렉토리 생성

!mkdir images          # 이미지 저장 폴더

!mkdir models          # 모델 파일 저장 폴더

 

# 모델 파일 다운로드

# 나이 추론을 위한 Caffe 모델 (학습된 weights)

!wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=1jdC5QuBpp3yrOsm5_XjlYvqMIZqLUjC7' -O models/age_net.caffemodel

 

# 나이 추론 모델의 네트워크 구조 정의 파일

!wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=1ARLVcyQ6xbQ6-dx9xoe3CcSCPL-zltIQ' -O models/deploy_age.prototxt

 

# 성별 추론을 위한 Caffe 모델

!wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=1p1q2vGh5EvyvtsZOKkK4zmKU0SJXRoVN' -O models/gender_net.caffemodel

 

# 성별 추론 모델의 네트워크 구조 정의 파일

!wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=1QjFXSeKYeQXfiQPx-4za1-DHaCoLOFAz' -O models/deploy_gender.prototxt

 

# 예시 이미지 다운로드

!wget 'https://www.cjknews.com/data/photos/20250311/art_17415625486761_d1cee0.jpg' -O images/aesoon.jpg

 

# numpy, opencv 설치 및 확인

!pip list | grep numpy

!pip list | grep opencv-python

!pip install numpy==1.26.3

!pip install opencv-python==4.9.0.80

 

# 필수 라이브러리 import

import cv2, glob, dlib

from google.colab.patches import cv2_imshow  # Colab에서 이미지 출력용

 

# 추론 결과로 받을 나이 및 성별 리스트 정의

age_list = ['(0, 2)', '(4, 6)', '(8, 12)', '(15, 20)', '(25, 32)', '(38, 43)', '(48, 53)', '(60, 100)']

gender_list = ['Male', 'Female']

 

# 얼굴 검출기 로드 (dlib의 기본 frontal face detector)

detector = dlib.get_frontal_face_detector()

 

# 나이/성별 추론을 위한 Caffe 모델 로드

age_net = cv2.dnn.readNetFromCaffe('models/deploy_age.prototxt', 'models/age_net.caffemodel')

gender_net = cv2.dnn.readNetFromCaffe('models/deploy_gender.prototxt', 'models/gender_net.caffemodel')

 

# 이미지 리스트 불러오기

img_list = glob.glob('images/*.jpg')

 

# 이미지 순회

for img_path in img_list:

  img = cv2.imread(img_path)                        # 이미지 읽기

  img = cv2.resize(img, (716, 512))                # 크기 조정 (가로 716, 세로 512)

 

  faces = detector(img)                             # 얼굴 검출

 

  for face in faces:

    # 얼굴 영역 좌표

    x1, y1, x2, y2 = face.left(), face.top(), face.right(), face.bottom()

    face_img = img[y1:y2, x1:x2].copy()             # 얼굴 부분만 crop

 

    # DNN 입력용 blob 생성

    blob = cv2.dnn.blobFromImage(face_img, scalefactor=1, size=(227, 227),

                                 mean=(78.4263377603, 87.7689143744, 114.895847746),

                                 swapRB=False, crop=False)

 

    # 성별 추론

    gender_net.setInput(blob)

    gender_preds = gender_net.forward()

    gender = gender_list[gender_preds[0].argmax()]  # 확률이 가장 높은 클래스 선택

 

    # 나이 추론

    age_net.setInput(blob)

    age_preds = age_net.forward()

    age = age_list[age_preds[0].argmax()]

 

    # 얼굴에 박스와 텍스트 표시

    cv2.rectangle(img, (x1, y1), (x2, y2), (255, 255, 255), 2)

    overlay_text = '%s %s' % (gender, age)

 

    # 텍스트 그림자 효과 (검정 배경)

    cv2.putText(img, overlay_text, org=(x1, y1), fontFace=cv2.FONT_HERSHEY_SIMPLEX,

                fontScale=1, color=(0, 0, 0), thickness=10)

 

    # 텍스트 본문 (흰색)

    cv2.putText(img, overlay_text, org=(x1, y1), fontFace=cv2.FONT_HERSHEY_SIMPLEX,

                fontScale=1, color=(255, 255, 255), thickness=2)

 

  # 이미지 출력 (Colab 전용)

  cv2_imshow(img)

 

  # 결과 저장하고 싶을 경우 아래 주석 해제

  # cv2.imwrite('result/%s' % img_path.split('/')[-1], img)

 
제목 날짜
태그 목록
위로