Py
수업 시작 전 · Python 3.12.10 설치
Windows 64비트 기준입니다. 수업용 PC의 Python 버전을 동일하게 맞추면 실습 오류를 줄일 수 있습니다.
기존 버전 확인: 이미 Python이 설치되어 있다면 CMD에서 py -0p를 입력해 설치된 버전을 확인할 수 있습니다. 다른 버전은 삭제하지 않아도 되며, 수업에서는 py -3.12를 사용합니다.
1
설치 파일 다운로드python-3.12.10-amd64.exe 파일을 다운로드한 뒤 실행합니다.2
PATH 항목 체크설치 첫 화면 아래의 Add python.exe to PATH를 반드시 체크합니다.3
Install NowInstall Now를 눌러 설치하고, 완료 화면이 나타날 때까지 기다립니다.4
CMD에서 확인새 CMD를 열고 py -3.12 --version을 입력해 Python 3.12.10이 표시되는지 확인합니다.중요: 기존에 다른 Python 버전이 설치되어 있어도 먼저 삭제할 필요는 없습니다. Python 3.12.10 설치 후 기존 CMD 창을 닫고 새 CMD 창을 연 다음 py -3.12 방식으로 수업을 진행합니다. 여러 버전이 설치된 PC에서도 3.12 버전을 정확히 지정할 수 있습니다.
오늘 실습 흐름
1. 웹캠 준비노트북 웹캠과 Python/OpenCV를 확인합니다.
2. 얼굴 학습웹캠으로 얼굴 사진을 수집하고 모델을 만듭니다.
3. 실시간 인식얼굴 사각형, 이름, 유사도 %를 표시합니다.
주의: 화면의 %는 실제 확률이 아니라 학습 이미지와의 유사도 점수입니다.
개인정보 약속
- 본인 또는 허락받은 사람의 얼굴만 촬영합니다.
- 얼굴 사진은 수업 실습용으로만 사용합니다.
- 수업이 끝나면 face_recognition_laptop_app 폴더를 삭제합니다.
1단계. 실습 폴더 만들기
Windows 노트북 기준입니다. CMD를 열고 아래 명령어를 실행하세요.
폴더 위치: 학교 PC의 바탕화면(Desktop)이 OneDrive 등으로 변경된 경우를 피하기 위해 실습 폴더를 %USERPROFILE% 아래에 만듭니다. 예: C:\Users\학생계정\face_recognition_laptop_app
Windows CMD 폴더 생성 명령어
cd %USERPROFILE%
mkdir face_recognition_laptop_app
cd face_recognition_laptop_app
mkdir dataset
mkdir trainer
dir
2단계. Python과 OpenCV 설치/확인
권장: 수업용 PC는 Python 3.12.10 64-bit로 통일하면 설치 오류를 줄일 수 있습니다. Python 설치 후 CMD를 새로 열어 아래 순서대로 확인하세요.
Python과 pip 설치 확인
py -3.12 --version
py -3.12 -m pip --version
중요: 이 교재에서는 urllib.request를 사용합니다. 이것은 Python 기본 기능이므로 urllib3를 별도로 설치할 필요가 없습니다.
pip 업그레이드
py -3.12 -m pip install --upgrade pip
NumPy 설치
py -3.12 -m pip install numpy
OpenCV 얼굴인식 패키지 설치
py -3.12 -m pip install opencv-contrib-python==4.11.0.86
버전을 고정하는 이유: 최신 opencv-contrib-python(5.0.0 계열)은 얼굴 인식에 쓰는 Haar Cascade XML 데이터 파일이 기본 포함되지 않을 수 있습니다. 이 교재는 XML 파일이 정상 포함되는 4.11.0.86 버전으로 통일합니다(3단계 페르소나, 4단계 캡스톤 실습도 동일 버전을 사용합니다).
OpenCV / NumPy / 얼굴인식 기능 확인
py -3.12 -c "import cv2, numpy; print('OpenCV:', cv2.__version__); print('NumPy:', numpy.__version__); print('Face:', hasattr(cv2, 'face'))"
마지막 줄이 Face: True이면 얼굴 학습 기능을 사용할 수 있습니다.
설치가 안 될 때 먼저 확인하기
| CMD 메시지 | 확인할 내용 |
|---|---|
| 'python'은(는) 내부 또는 외부 명령... | Python 설치 시 PATH 등록이 되지 않았을 수 있습니다. Python을 다시 설치하면서 Add python.exe to PATH를 체크합니다. |
| No module named pip | py -3.12 -m ensurepip --upgrade 실행 후 다시 설치합니다. |
| Could not fetch URL, ProxyError, CERTIFICATE_VERIFY_FAILED | 학교 네트워크의 방화벽·프록시·보안 정책으로 PyPI 접속이 차단되었을 수 있습니다. 다른 네트워크에서 확인하거나 선생님에게 네트워크 정책을 확인합니다. |
| No matching distribution found | Python 버전 또는 32/64비트 환경이 맞지 않을 수 있습니다. 수업용 PC는 Python 3.12.10 64-bit 사용을 권장합니다. |
학교 수업 환경: 여러 대의 PC에서 동시에 설치할 때는 학교 인터넷 제한으로 설치가 실패할 수 있습니다. 이 경우 수업 전에 설치를 완료하거나, 필요한 .whl 파일을 준비한 오프라인 설치 방식을 사용하는 것이 안전합니다.
3단계. 웹캠 테스트 코드
파일 만들기 명령어
cd %USERPROFILE%\face_recognition_laptop_app
notepad 0_webcam_test.py
0_webcam_test.py 전체 코드
import cv2
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
if not cap.isOpened():
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("웹캠을 열 수 없습니다.")
print("Windows 설정 > 개인정보 및 보안 > 카메라 권한을 확인하세요.")
exit()
print("웹캠 테스트를 시작합니다.")
print("q 키를 누르면 종료됩니다.")
while True:
ret, frame = cap.read()
if not ret:
print("웹캠 화면을 가져오지 못했습니다.")
break
cv2.imshow("Webcam Test", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
웹캠 테스트 실행 명령어
py -3.12 0_webcam_test.py
4단계. 얼굴 사진 수집 코드
파일 만들기 명령어
cd %USERPROFILE%\face_recognition_laptop_app
notepad 1_collect_faces.py
1_collect_faces.py 전체 코드 (분류기 로드 예외처리 적용)
import cv2
import os
import urllib.request
# 1단계: 노트북 웹캠으로 얼굴 데이터 수집
# Haar Cascade 파일 보장 예외 처리
xml_name = "haarcascade_frontalface_default.xml"
xml_path = cv2.data.haarcascades + xml_name
face_cascade = cv2.CascadeClassifier(xml_path)
if face_cascade.empty():
print("[안내] 기본 경로에서 분류기를 발견하지 못하여 보완 로직을 실행합니다.")
if not os.path.exists(xml_name):
url = "https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml"
urllib.request.urlretrieve(url, xml_name)
face_cascade = cv2.CascadeClassifier(xml_name)
person_name = input("학습할 사람 이름을 입력하세요 (영문 권장): ").strip()
if person_name == "":
person_name = "student01"
save_dir = os.path.join("dataset", person_name)
os.makedirs(save_dir, exist_ok=True)
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
if not cap.isOpened():
cap = cv2.VideoCapture(0)
count = 0
max_count = 80
print("얼굴 데이터 수집을 시작합니다.")
print("노트북 웹캠을 정면으로 바라보세요.")
print("q 키를 누르면 중간에 종료됩니다.")
while True:
ret, frame = cap.read()
if not ret:
print("웹캠 화면을 가져오지 못했습니다.")
break
frame = cv2.flip(frame, 1) # 미러링 모드
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=4,
minSize=(30, 30)
)
for (x, y, w, h) in faces:
count += 1
face_img = gray[y:y+h, x:x+w]
face_img = cv2.resize(face_img, (200, 200))
file_path = os.path.join(save_dir, f"{count}.jpg")
cv2.imwrite(file_path, face_img)
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.putText(
frame,
f"Collecting: {count}/{max_count}",
(x, y-10),
cv2.FONT_HERSHEY_SIMPLEX,
0.7,
(0, 255, 0),
2
)
cv2.imshow("1. Face Data Collection - Laptop Webcam", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
if count >= max_count:
print("[SUCCESS] 얼굴 데이터 수집 완료!")
break
cap.release()
cv2.destroyAllWindows()
저장 후 실행 명령어
py -3.12 1_collect_faces.py
5단계. 얼굴 모델 학습 코드
파일 만들기 명령어
cd %USERPROFILE%\face_recognition_laptop_app
notepad 2_train_model.py
2_train_model.py 전체 코드
import cv2
import os
import numpy as np
# 2단계: 얼굴 모델 학습
dataset_dir = "dataset"
trainer_dir = "trainer"
os.makedirs(trainer_dir, exist_ok=True)
recognizer = cv2.face.LBPHFaceRecognizer_create()
faces = []
labels = []
label_map = {}
current_label = 0
if not os.path.exists(dataset_dir):
print("dataset 폴더가 존재하지 않습니다.")
exit()
for person_name in os.listdir(dataset_dir):
person_path = os.path.join(dataset_dir, person_name)
if not os.path.isdir(person_path):
continue
label_map[current_label] = person_name
for image_name in os.listdir(person_path):
image_path = os.path.join(person_path, image_name)
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if img is None:
continue
faces.append(img)
labels.append(current_label)
current_label += 1
if len(faces) == 0:
print("학습할 얼굴 이미지가 없습니다.")
print("먼저 1_collect_faces.py를 실행해 얼굴 이미지를 수집하세요.")
exit()
recognizer.train(faces, np.array(labels))
recognizer.write("trainer/face_model.yml")
with open("trainer/labels.txt", "w", encoding="utf-8") as f:
for label, name in label_map.items():
f.write(f"{label},{name}\n")
print("얼굴 모델 학습 완료")
print("저장 위치: trainer/face_model.yml")
print("이름표 저장 위치: trainer/labels.txt")
저장 후 실행 명령어
py -3.12 2_train_model.py
6단계. 실시간 얼굴 인식 코드
파일 만들기 명령어
cd %USERPROFILE%\face_recognition_laptop_app
notepad 3_recognize_live.py
3_recognize_live.py 전체 코드
import cv2
import os
import urllib.request
# 3단계: 노트북 웹캠으로 실시간 얼굴 인식
xml_name = "haarcascade_frontalface_default.xml"
xml_path = cv2.data.haarcascades + xml_name
face_cascade = cv2.CascadeClassifier(xml_path)
if face_cascade.empty():
if not os.path.exists(xml_name):
url = "https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_default.xml"
urllib.request.urlretrieve(url, xml_name)
face_cascade = cv2.CascadeClassifier(xml_name)
recognizer = cv2.face.LBPHFaceRecognizer_create()
if not os.path.exists("trainer/face_model.yml") or not os.path.exists("trainer/labels.txt"):
print("[ERROR] 학습된 모델 파일이 없습니다. 2단계를 먼저 실행해 주세요.")
exit()
recognizer.read("trainer/face_model.yml")
label_map = {}
with open("trainer/labels.txt", "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
label, name = line.split(",")
label_map[int(label)] = name
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
if not cap.isOpened():
cap = cv2.VideoCapture(0)
print("실시간 얼굴 인식을 시작합니다.")
print("q 키를 누르면 종료됩니다.")
while True:
ret, frame = cap.read()
if not ret:
print("웹캠 화면을 가져오지 못했습니다.")
break
frame = cv2.flip(frame, 1)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=4,
minSize=(30, 30)
)
for (x, y, w, h) in faces:
face_img = gray[y:y+h, x:x+w]
face_img = cv2.resize(face_img, (200, 200))
label, confidence = recognizer.predict(face_img)
if confidence < 75:
name = label_map.get(label, "Unknown")
accuracy = max(0, int(100 - confidence))
text = f"{name} ({accuracy}%)"
color = (0, 255, 0)
else:
text = f"Unknown ({max(0, int(100 - confidence))}%)"
color = (0, 0, 255)
cv2.rectangle(frame, (x, y), (x+w, y+h), color, 2)
cv2.putText(
frame,
text,
(x, y-10),
cv2.FONT_HERSHEY_SIMPLEX,
0.8,
color,
2
)
cv2.imshow("3. Live Face Recognition - Laptop Webcam", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cap.release()
cv2.destroyAllWindows()
저장 후 실행 명령어
py -3.12 3_recognize_live.py
종료하려면 카메라 화면을 클릭한 뒤 q 키를 누르세요.
잘 안 될 때
| 증상 | 해결 |
|---|---|
| 웹캠 화면이 안 열림 | Windows 설정 > 개인정보 및 보안 > 카메라 권한을 켭니다. Zoom/Teams/카메라 앱을 닫고 다시 실행합니다. |
| cv2.face 오류 | py -3.12 -m pip install opencv-contrib-python==4.11.0.86을 다시 실행합니다. |
| AttributeError: module 'cv2' has no attribute ... | 다른 실습에서 opencv-python·opencv-python-headless·opencv-contrib-python을 섞어 설치했을 때 생기는 충돌입니다. 아래 명령으로 전부 지운 뒤 버전을 고정해 하나만 다시 설치하세요: py -3.12 -m pip uninstall opencv-python opencv-python-headless opencv-contrib-python -y 실행 후 py -3.12 -m pip install opencv-contrib-python==4.11.0.86 |
| 얼굴이 잘 안 잡힘 | 밝은 곳에서 정면을 보고 얼굴을 화면 중앙에 크게 위치시킵니다. |
| 다른 사람으로 인식됨 | 얼굴 사진을 더 다양하게 다시 수집하고 모델을 다시 학습합니다. |
수업 끝나고 전체 삭제하기
Windows CMD 삭제 명령어
cd %USERPROFILE%
rmdir /s /q face_recognition_laptop_app
dir
주의: 삭제 명령은 되돌리기 어렵습니다. 반드시 선생님 안내에 따라 실행하세요.