1 / 30

파이썬으로 배우는
MediaPipe

카메라로 손과 얼굴을 읽는 AI를
오늘 내 컴퓨터에서 직접 돌려 봅니다

들어가며

MediaPipe란 무엇인가

MediaPipe는 구글이 미리 학습시켜 둔 "보는 능력"을 빌려 쓰는 도구 상자입니다.

용어: 모델(model)

수많은 사진으로 공부를 끝낸 프로그램 부품. "손 사진을 주면 관절 위치를 답하는 문제집 만점자"라고 생각하면 됩니다.

들어가며

MediaPipe로 할 수 있는 일

이번 수업에서는 비전(시각) 기능 가운데 대표적인 두 가지를 직접 다룹니다.

오늘 실습 ①

손 랜드마크

손 하나에서 관절 위치 21개 점을 실시간으로 찾아냅니다. 손가락 개수 세기, 제스처 인식의 재료가 됩니다.

오늘 실습 ②

얼굴 랜드마크

얼굴에서 478개 점을 찾습니다. 눈동자(홍채) 위치와, 표정을 숫자로 알려주는 표정 수치 52가지도 함께 나옵니다.

다음 시간

제스처 인식

주먹, 브이(V), 엄지척 같은 대표 손 모양 7가지를 이름으로 알려줍니다. 플레이그라운드에서 사용합니다.

들어가며

랜드마크: 번호가 달린 점

랜드마크(landmark)는 몸의 중요한 위치마다 찍히는, 번호가 정해진 점입니다.

용어: 프레임(frame)

동영상을 이루는 낱장 사진 한 장. 웹캠은 보통 1초에 30장 정도의 프레임을 보내 줍니다.

들어가며

좌표 읽는 법: 0~1 비율값

랜드마크의 좌표는 픽셀이 아니라 0에서 1 사이의 비율값으로 옵니다.

주의: y좌표는 아래로 갈수록 커집니다(수학 시간의 좌표평면과 반대). "손가락 끝이 마디보다 위에 있다"는 조건이 코드에서 y가 더 작다로 쓰이는 이유입니다.
들어가며

Tasks API: 세 조각이면 끝

MediaPipe의 최신 사용법(Tasks API)은 전자레인지를 쓰는 순서와 같습니다.

options = HandLandmarkerOptions(          # ② 옵션 설정
    base_options=BaseOptions(model_asset_path="hand_landmarker.task"),  # ① 모델 파일
    running_mode=RunningMode.VIDEO,
)
landmarker = HandLandmarker.create_from_options(options)
result = landmarker.detect_for_video(frame, timestamp)   # ③ detect 호출
용어: .task 파일

학습이 끝난 모델을 담은 상자 파일. 우리 예제는 첫 실행 때 인터넷에서 자동으로 내려받습니다.

들어가며

실행 모드 세 가지

같은 모델도 입력이 무엇이냐에 따라 세 가지 모드 중 하나로 돌립니다.

모드 입력 특징
IMAGE 사진 1장 가장 단순. 순서 개념이 없음
VIDEO 동영상·웹캠 프레임을 순서대로 앞 프레임 정보를 활용해 더 안정적. 이번 수업에서 사용
LIVE_STREAM 실시간 영상 (비동기) 결과가 나중에 별도 함수로 도착. 빠르지만 코드 흐름이 어려움
VIDEO 모드를 고른 이유: "읽기 → 계산 → 그리기"가 한 줄기로 흘러서 코드의 흐름이 눈에 보이기 때문입니다. 익숙해지면 LIVE_STREAM으로 속도를 올릴 수 있습니다.
1장. 준비와 설치

준비물 점검

설치는 처음 한 번만 하면 됩니다. 필요한 것은 네 가지입니다.

검은 창(명령 프롬프트)이 무섭다면 안심하세요. 이번 수업에서 검은 창에 입력하는 것은 딱 두 줄이고, 둘 다 복사 버튼이 있습니다.
1장. 준비와 설치

원클릭 설치: 파이썬 + MediaPipe

아래 파일 하나를 내려받아 실행하면 파이썬 3.12와 MediaPipe를 한 번에 설치할 수 있습니다.

  1. 위 버튼으로 install_python_mediapipe.cmd 파일을 내려받습니다.
  2. 다운로드한 파일을 더블클릭합니다. 권한 요청 창이 뜨면 를 누릅니다.
  3. 검은 창에서 설치가 끝날 때까지 기다립니다. 마지막에 Done.이 보이면 성공입니다.
이 파일은 64비트 Windows용입니다. 학교 PC에서 브라우저가 실행을 막으면, 파일을 우클릭해 관리자 권한으로 실행하세요.
1장. 준비와 설치

파이썬 설치: 체크박스 하나가 핵심

python.org에서 설치할 때, 첫 화면의 체크박스 하나가 가장 중요합니다.

  1. python.org/downloads 접속 → 노란 Download Python 3.12 버튼 클릭
  2. 내려받은 파일 실행 → 설치 첫 화면 맨 아래를 확인
  3. "Add python.exe to PATH" 체크박스 선택
  4. Install Now 클릭 → 완료
"Add python.exe to PATH"란? 어느 폴더에서든 "python"이라고 부르면 대답하도록 이름을 등록하는 것입니다. 이 체크 하나로 검은 창에서 겪는 문제 대부분이 사라집니다.

이미 파이썬이 설치되어 있다면 이 슬라이드는 건너뛰어도 됩니다.

1장. 준비와 설치

검은 창 첫째 줄: 꾸러미 설치

필요한 꾸러미(패키지) 두 개를 한 줄로 설치합니다.

  1. 시작 버튼 → cmd 입력 → Enter (검은 창이 열립니다)
  2. 아래 한 줄을 복사해 붙여넣고 Enter
pip install mediapipe opencv-python
1장. 준비와 설치

검은 창 둘째 줄: 설치 확인

설치가 잘 되었는지 한 줄로 확인합니다. 검은 창은 이걸로 끝입니다.

python -c "import mediapipe; print(mediapipe.__version__)"
1장. 준비와 설치

코드 실행법: IDLE에서 F5

이제부터 코드는 IDLE에서 실행합니다. 검은 창은 더 이상 필요 없습니다.

  1. 시작 버튼 → IDLE 검색 → 실행
  2. 메뉴에서 File → New File (새 코드 창이 열립니다)
  3. 슬라이드의 예제 코드를 복사해서 붙여넣기
  4. Ctrl+S 저장 — 이름은 예: hand_landmarks.py
  5. F5 실행 → 카메라 창이 뜨면 성공 → 종료는 ESC
용어: IDLE

파이썬을 설치하면 따라오는 기본 코드 편집기. 쓰던 편집기(VS Code 등)가 있다면 그대로 써도 됩니다.

2장. 손 랜드마크 예제

첫 번째 목표

웹캠 속 내 손 위에 21개의 점과 뼈대 선이 실시간으로 그려지고, 화면에 편 손가락 개수가 표시되는 프로그램을 만듭니다.

2장. 손 랜드마크 예제

손 랜드마크 21개 지도

21개 점의 번호는 손목(0)에서 시작해 손가락 끝으로 갈수록 커집니다.

0 손목 4 8 12 16 20
번호위치
0손목
4엄지 끝
8검지 끝
12중지 끝
16약지 끝
20새끼 끝
각 손가락은 뿌리→끝 방향으로 번호가 4씩 이어집니다. 예: 검지는 5(뿌리) → 6 → 7 → 8(끝). 그래서 "검지 끝"은 언제나 landmarks[8]입니다.
2장. 손 랜드마크 예제

전체 코드: hand_landmarks.py

아래 코드를 통째로 복사해 IDLE 새 파일에 붙여넣고 F5를 누르세요.

코드를 불러오는 중...
첫 실행 때 모델 파일을 자동으로 내려받으므로 잠시 기다려 주세요. [수정 지점]을 검색하면(Ctrl+F) 실험할 부분이 보입니다. 파일로 받기 ↓
2장. 손 랜드마크 예제

코드 읽기 ① 설정값과 모델 다운로드

코드 맨 위의 설정값 블록은 프로그램의 손잡이입니다. 몸통을 몰라도 손잡이만 돌리면 동작이 바뀝니다.

NUM_HANDS = 1               # [수정 지점] 인식할 손 개수 (1 또는 2)
DOT_COLOR = (0, 255, 0)     # [수정 지점] 점 색깔 (파랑, 초록, 빨강) 각 0~255

def download_model():
    """모델 파일이 없으면 인터넷에서 한 번만 받아 옵니다."""
    if os.path.exists(MODEL_FILE):
        return
    urllib.request.urlretrieve(MODEL_URL, MODEL_FILE)
2장. 손 랜드마크 예제

코드 읽기 ② 카메라 루프

while 반복문 안에서는 매 프레임 같은 다섯 동작이 되풀이됩니다.

  1. 읽기 — cap.read()로 카메라에서 사진 한 장을 가져옵니다.
  2. 거울 뒤집기 — cv2.flip으로 좌우를 뒤집어 거울처럼 보이게 합니다.
  3. 색 순서 변환 — OpenCV는 BGR, MediaPipe는 RGB를 씁니다. 같은 사진을 다른 언어로 번역하는 단계입니다.
  4. detect_for_video — 랜드마크 21개를 계산합니다. 시간 도장(타임스탬프)을 함께 넘겨 "이 장면이 몇 번째 시각인지" 알려줍니다.
  5. 그리기·표시 — 점, 선, 손가락 개수, FPS를 그려서 창에 보여줍니다.
용어: FPS (frames per second)

1초에 처리하는 장면 수. 15 이상이면 실시간으로 부드럽게 느껴집니다.

2장. 손 랜드마크 예제

코드 읽기 ③ 손가락 세는 규칙

count_fingers()는 복잡한 AI가 아니라, 좌표를 비교하는 단순한 규칙입니다.

수정 지점효과
DOT_COLOR / DOT_SIZE점의 색과 크기
NUM_HANDS = 2두 손 동시 인식
count_fingers()의 규칙나만의 판정 규칙
print(...) 주석 해제검지 끝 좌표를 숫자로 관찰
2장. 손 랜드마크 예제

3분 도전

직접 바꿔 봅시다. 저장(Ctrl+S) 후 다시 F5를 누르면 바뀐 코드로 실행됩니다.

도전 1

점을 빨간색으로

DOT_COLOR = (0, 0, 255)
색 순서가 (파랑, 초록, 빨강)이라는 점을 기억하세요.

도전 2

두 손 인식하기

NUM_HANDS = 2
두 손을 화면에 올리면 각 손의 손가락 개수가 따로 표시됩니다.

도전 3

검지 끝 좌표 출력

[수정 지점] 주석이 달린 print(...) 줄의 #을 지우고 손의 움직임에 따라 숫자가 어떻게 변하는지 관찰해 보세요.

심화 도전: 브이(V) 모양일 때 "V!"를 표시해 보세요. 힌트 — 편 손가락이 2개이면서, 그 둘이 검지(8)와 중지(12)인지 count_fingers() 방식으로 검사하면 됩니다.
3장. 얼굴·홍채 랜드마크 예제

두 번째 목표

얼굴 위 478개의 점, 눈동자(홍채) 강조 표시, 표정 수치 게이지, 그리고 시선 방향까지 한 화면에 띄웁니다.

3장. 얼굴·홍채 랜드마크 예제

블렌드셰이프: 표정 계기판 52개

블렌드셰이프(blendshape)는 표정 하나하나를 0~1 사이 게이지로 알려주는 52개의 계기판입니다.

거울 모드 주의: 예제는 화면을 거울처럼 뒤집어 보여줍니다. 그래서 Left/Right 라벨이 반대처럼 느껴질 수 있습니다. 직접 한쪽 눈을 윙크해 보고 어느 게이지가 움직이는지 확인해 보세요 — 그 자체가 좋은 실험입니다.
3장. 얼굴·홍채 랜드마크 예제

눈·홍채 랜드마크 지도

얼굴 478개 점의 마지막 10개(468~477)는 눈동자, 곧 홍채의 점입니다.

468 중심 473 중심 33 133 362 263
  • 468~472: 한쪽 눈의 홍채 5점 — 중심(468)과 상하좌우.
  • 473~477: 반대쪽 눈의 홍채 5점 — 중심은 473.
  • 파란 점 33·133, 362·263은 각 눈의 양쪽 끝(눈꼬리)입니다.
  • 시선의 원리: 눈동자 중심이 눈 양끝 사이에서 어디쯤 있는지 비율을 재면, 왼쪽을 보는지 오른쪽을 보는지 알 수 있습니다.
용어: 홍채(iris)

눈동자의 색이 있는 부분. 홍채의 중심을 따라가면 곧 시선을 따라가는 것과 같습니다.

3장. 얼굴·홍채 랜드마크 예제

전체 코드: face_landmarks.py

손 예제와 같은 방법입니다. 통째로 복사해 IDLE 새 파일에 붙여넣고 F5를 누르세요.

코드를 불러오는 중...
입을 벌리면 "Mouth Open!", 눈을 움직이면 화면 아래 Gaze 표시가 바뀝니다. 파일로 받기 ↓
3장. 얼굴·홍채 랜드마크 예제

손 예제와 달라진 곳 네 군데

뼈대는 같으므로, 아래 네 군데만 짚으면 코드 전체를 이해한 것입니다.

어디무엇이 달라졌나
모델 파일hand_landmarker.task → face_landmarker.task
옵션output_face_blendshapes=True — 표정 계기판 52개를 함께 계산해 달라는 요청
그리기478개 점은 작게, 홍채 10개는 크고 붉게 구분해서 그림 (draw_face)
새 함수gaze_x() 시선 계산, draw_blendshape_bars() 게이지 막대
3장. 얼굴·홍채 랜드마크 예제

3분 도전

표정과 시선을 조건문의 재료로 써 봅시다.

도전 1

눈 깜빡임 카운터

eyeBlinkLeft가 0.5를 넘는 순간을 세어 보세요. 힌트: "이전 프레임에는 안 넘었는데 지금 넘었다"를 변수 하나로 기억하면 됩니다.

도전 2

시선 화살표

Gaze가 LEFT면 "<<<", RIGHT면 ">>>"를 화면 가운데에 표시해 보세요. gaze_x() 값과 cv2.putText를 조합합니다.

도전 3

놀란 눈썹 감지

WATCH_BLENDSHAPES에 "browInnerUp"을 추가하고, 눈썹을 올릴 때 게이지가 차오르는 것을 확인하세요.

4장. 확장 아이디어

예제를 고치면 과제가 됩니다

오늘 다룬 두 예제는 그대로 수행 과제의 출발점입니다. 각 아이디어 옆에 고칠 곳을 적어 두었습니다.

가위바위보 판정기

편 손가락 0개=바위, 2개=가위, 5개=보. count_fingers()의 결과로 조건문을 만들면 됩니다.

얼굴

윙크 스위치

한쪽 eyeBlink만 높고 반대쪽은 낮을 때 동작. WATCH_BLENDSHAPES와 조건문 조합.

손×2

손가락 계산기

NUM_HANDS=2로 두고 두 손의 손가락 개수를 더해서 표시. 두 손 덧셈 연습기가 됩니다.

홍채

시선 포인터

gaze_x() 값으로 화면 속 네모를 좌우로 움직여 보세요. 시선 마우스의 원리입니다.

문제 해결

자주 만나는 문제 5가지

오류는 실패가 아니라 단서입니다. 증상을 찾아 그대로 따라 해 보세요.

증상원인해결
카메라가 안 켜짐 다른 앱이 카메라 사용 중, 또는 권한 꺼짐 Zoom·Teams 등 종료 → 윈도우 설정 → 개인 정보 → 카메라 허용. 그래도 안 되면 CAM_INDEX를 1로
'pip'은(는) 인식할 수 없는 명령… 설치 때 PATH 체크를 안 함 파이썬 설치 파일을 다시 실행 → "Add python.exe to PATH" 체크 후 재설치
모델 다운로드 실패 인터넷·학교 방화벽 인터넷 연결 확인 후 재실행. 안 되면 선생님이 내려받은 .task 파일을 코드와 같은 폴더에 복사
화면이 뚝뚝 끊김 PC 성능·역광 다른 프로그램 닫기, 조명을 얼굴 앞쪽으로. FPS 표시로 개선을 확인
창이 안 닫힘 종료 키를 모름 카메라 창을 클릭한 뒤 ESC. 멈춘 것 같으면 IDLE 메뉴 Shell → Restart Shell
다음 단계

플레이그라운드: 코드 없이 ESP32 조종

다음 시간에는 오늘 배운 랜드마크 값을 브라우저에서 노드로 연결해, 얼굴과 손으로 ESP32 보드를 조종합니다.

정리

오늘 배운 세 조각

이 세 가지만 기억하면 MediaPipe의 어떤 기능이든 같은 방법으로 쓸 수 있습니다.

과제: "확장 아이디어" 중 하나를 완성한 뒤 수정한 코드와 실행 화면을 캡처해 제출하세요.