Python 및 OpenCV를 사용한 간단한 연령 및 성별 감지
20153 단어 tutorialpythonbeginnersdevjournal
소개
안녕하세요! 이 튜토리얼에서는 Python 및 OpenCV를 사용하여 간단한 연령 및 성별 감지기를 만드는 방법을 보여줍니다. 😃
요구 사항
파이썬 가상 환경 생성
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
내가 일하는 것처럼? 다양한 주제에 대해 포스팅하고 있으니 더 보고 싶으시면 좋아요와 팔로우 부탁드립니다.
또한 저는 커피를 좋아합니다.
Reference
이 문제에 관하여(Python 및 OpenCV를 사용한 간단한 연령 및 성별 감지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ethand91/simple-age-and-gender-detection-using-python-and-opencv-319h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)