iBetter Books
수정

두 번째 프로젝트는 강의실의 집중도·감정을 모니터링하는 시스템입니다. 그런데 이 프로젝트는 기술보다 윤리가 먼저입니다. PART 08에서 강조했듯, 개인의 표정으로 그 사람을 평가하는 것은 부정확하고 위험합니다. 그래서 이 시스템은 처음부터 "개인 판정이 아니라 전체 집계"라는 원칙 위에 설계합니다.

설계 원칙 — 개인이 아니라 전체

먼저 무엇을 만들지, 그리고 무엇을 만들지 않을지를 분명히 합니다.

만든다 만들지 않는다
"강의실 전체의 집중 비율" 같은 익명 집계 "철수의 집중도 점수" 같은 개인 평가
시간에 따른 전체 경향 그래프 개인별 성적·징계 반영
수업 개선용 익명 피드백 개인 식별·추적

이 원칙은 PART 08 Ch06의 결론을 실천하는 것입니다. 표정은 감정이 아니고, 감정 추정은 부정확하므로, 개인을 판정하는 데 쓰면 안 됩니다. 대신 전체의 경향은 수업을 개선하는 익명 신호로 가치가 있습니다.

집계 신호 만들기

집중·참여의 단서로 두 가지를 씁니다. PART 03의 EAR(눈 감김으로 졸음)과 PART 08의 표정입니다. 핵심은 사람마다의 값을 저장하지 않고, 그 자리에서 전체 통계로만 합치는 것입니다.

# 파일: classroom_monitor.py"""강의실 프레임에서 익명 집계 신호만 추출한다(개인 미저장)."""import numpy as npimport cv2import dlibdetector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")LEFT, RIGHT = list(range(36, 42)), list(range(42, 48))def eye_aspect_ratio(eye):    a = np.linalg.norm(eye[1] - eye[5])    b = np.linalg.norm(eye[2] - eye[4])    c = np.linalg.norm(eye[0] - eye[3])    return (a + b) / (2.0 * c)def aggregate_frame(frame):    """한 프레임에서 전체 집계만 반환. 개인 정보는 저장하지 않는다."""    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)    rects = detector(gray, 0)    total = len(rects)    eyes_open = 0    for rect in rects:        pts = np.array([[p.x, p.y] for p in predictor(gray, rect).parts()])        ear = (eye_aspect_ratio(pts[LEFT]) + eye_aspect_ratio(pts[RIGHT])) / 2        if ear > 0.2:                 # 눈을 뜨고 있음            eyes_open += 1    # 개인별 값이 아니라 전체 비율만 반환    attentive_ratio = eyes_open / total if total else 0.0    return {"faces": total, "attentive_ratio": round(attentive_ratio, 2)}

aggregate_frame은 누가 졸았는지가 아니라 "전체 중 눈을 뜬 비율"만 돌려줍니다. 개인의 얼굴이나 이름, 개인별 점수는 어디에도 남기지 않습니다. 이것이 "집계 중심" 설계의 코드 수준 실천입니다.

시간에 따른 경향 보기

프레임마다의 집계를 시간축으로 쌓으면, 수업 중 집중도가 어떻게 변했는지 익명 그래프가 됩니다.

# 파일: trend.py (개념)timeline = []# 일정 간격으로agg = aggregate_frame(frame)timeline.append(agg["attentive_ratio"])# 수업 후: timeline을 그래프로 → "20분쯤 집중도 하락" 같은 익명 신호
flowchart LR A[프레임] --> B[전체 집계
눈뜬 비율] B --> C[시간축 누적] C --> D[익명 경향 그래프
수업 개선 신호]

이런 경향은 "이 부분에서 다들 집중이 떨어졌으니 설명을 보강하자" 같은 수업 개선에 쓸 수 있습니다. 특정 학생을 지목하는 것이 아니라, 수업 자체를 돌아보는 거울입니다.

반드시 지킬 것

  • 고지와 동의: 모니터링한다는 사실을 알리고 동의를 받습니다.
  • 개인 미저장: 얼굴·이름·개인 점수를 저장하지 않습니다(위 코드처럼 집계만).
  • 평가 금지: 결과를 성적·징계 등 개인 불이익에 쓰지 않습니다.
  • 목적 한정: 수업 개선이라는 목적 외로 쓰지 않습니다.

실무 팁. "집계만 한다"는 설계는 코드로 강제하는 것이 가장 확실합니다. 개인별 데이터를 애초에 변수에 담지 않으면, 실수로라도 저장하거나 유출할 수 없습니다. 위 aggregate_frame이 개인 값을 지역 변수에서 즉시 비율로 합치고 버리는 것처럼, "민감 데이터를 만들지 않는" 구조가 "만들었다가 잘 지우는" 구조보다 안전합니다.

이 장에서 기억할 것

집중도·감정 모니터링은 기술보다 윤리가 먼저입니다. 개인 판정이 아니라 익명 집계(전체 눈뜬 비율 등)만 만들고, EAR(PART 03)·표정(PART 08)을 그 자리에서 통계로 합쳐 개인 데이터를 남기지 않습니다. 시간축 경향은 수업 개선의 익명 신호로 쓰되, 고지·동의·평가 금지·목적 한정을 지킵니다. "민감 데이터를 만들지 않는" 코드 구조가 가장 안전합니다. 다음 장에서는 반대로 프라이버시를 보호하는 도구, 얼굴 모자이크를 만듭니다.