생성형 AI 활용하기

생성형 AI를 활용한 가상 피팅 개발하기 (2)

Pro.Dev 2024. 12. 12. 17:29
반응형

인체 주요 부위 추출 및 치수 측정

이 단계에서는 세그멘테이션된 이미지를 사용하여 신체의 주요 부위를 추출하고, 신체 치수를 추정하는 작업을 수행합니다. 이를 위해 MediaPipe 라이브러리를 사용하여 인체 포즈를 분석할 수 있습니다.

1. MediaPipe 설치

먼저, MediaPipe를 설치해야 합니다. 이미 설치하셨다면 이 단계를 건너뛰어도 됩니다.

pip install mediapipe

2. 인체 포즈 추정 함수 정의

MediaPipe를 사용하여 인체의 주요 포인트를 추정하는 함수를 작성합니다.

import mediapipe as mp

def estimate_body_pose(image):
    mp_pose = mp.solutions.pose
    pose = mp_pose.Pose(static_image_mode=True, min_detection_confidence=0.5)

    # 이미지에서 포즈 추정
    results = pose.process(image)

    if results.pose_landmarks:
        landmarks = results.pose_landmarks.landmark
        return landmarks
    else:
        return None

3. 신체 치수 측정 함수 정의

신체의 주요 부위(예: 어깨, 허리, 엉덩이 등)의 좌표를 기반으로 신체 치수를 계산하는 함수를 작성합니다.

def calculate_body_measurements(landmarks):
    if landmarks is None:
        return None

    # 주요 포인트 인덱스 (MediaPipe Pose의 landmark index)
    shoulder_left = landmarks[mp.solutions.pose.PoseLandmark.LEFT_SHOULDER.value]
    shoulder_right = landmarks[mp.solutions.pose.PoseLandmark.RIGHT_SHOULDER.value]
    hip_left = landmarks[mp.solutions.pose.PoseLandmark.LEFT_HIP.value]
    hip_right = landmarks[mp.solutions.pose.PoseLandmark.RIGHT_HIP.value]

    # 어깨 너비 및 엉덩이 너비 계산 (픽셀 거리)
    shoulder_width = np.linalg.norm(np.array([shoulder_left.x, shoulder_left.y]) - np.array([shoulder_right.x, shoulder_right.y]))
    hip_width = np.linalg.norm(np.array([hip_left.x, hip_left.y]) - np.array([hip_right.x, hip_right.y]))

    return {
        "shoulder_width": shoulder_width,
        "hip_width": hip_width,
    }

4. 메인 함수 수정

메인 함수를 수정하여 포즈 추정을 수행하고 신체 치수를 계산합니다.

def main():
    person_image_path = 'input/person.jpg'

    # Load image
    person_image = load_image(person_image_path)

    # Preprocess image
    person_image_processed = preprocess_image(person_image)

    # Load segmentation model
    model = load_segmentation_model()

    # Segment person from the image
    segmentation_mask = segment_person(person_image_processed, model)

    # Estimate body pose
    body_landmarks = estimate_body_pose(person_image_processed)

    # Calculate body measurements
    measurements = calculate_body_measurements(body_landmarks)

    # Display results
    display_image(person_image_processed, title="Processed Person Image")

    if measurements:
        print("Body Measurements:")
        print(f"Shoulder Width: {measurements['shoulder_width']:.2f}")
        print(f"Hip Width: {measurements['hip_width']:.2f}")

    display_image(segmentation_mask, title="Segmentation Mask")

if __name__ == "__main__":
    main()

5. 코드 실행

위 코드를 작성한 후, 터미널에서 다음 명령어로 실행합니다:

python main.py

이 코드는 사람 전신 사진을 로드하고 전처리한 후, 인체 세그멘테이션을 수행하고 MediaPipe를 사용하여 신체의 주요 포즈를 추정하며, 어깨 너비와 엉덩이 너비를 계산합니다. 결과는 콘솔에 출력됩니다.

반응형