Skip to content

이 프로젝트는 단일 손 기반 수어 동작을 실시간으로 인식하고, 인식된 결과를 영상 위에 말풍선 형태로 시각화하는 컴퓨터 비전 프로그램입니다. 사용자는 GUI를 통해 새로운 수어 데이터를 직접 수집하고, 버튼 클릭 만으로 모델을 자동 재학습한 뒤 바로 실시간 인식까지 수행할 수 있습니다.

Notifications You must be signed in to change notification settings

yangdohee/Term-project

Repository files navigation

SIGNAL PROJECT

실시간 수어 해석 프로그램

본 프로젝트는 단일 손 수어를 실시간으로 인식하고 그 결과를 말풍선 형태로 시각화하는 Python 기반 컴퓨터 비전 애플리케이션입니다. 사용자는 GUI를 통해 새로운 수어 데이터를 수집하고 모델을 재학습할 수 있으며, 실시간으로 수어를 예측하여 영상에 오버레이하는 기능을 제공합니다.


프로젝트 구조

SIGNLAL_PROJECT/
├── main.py                  # 실시간 수어 인식 GUI 실행
├── gui_launcher.py          # 수어 수집, 재학습, 실시간 실행을 통합 제어하는 GUI 런처
├── batch_collector.py       # 시퀀스 단위로 수어 데이터를 수집하여 .npy 저장
├── auto_retrain.py          # 전체 데이터를 기반으로 LSTM 모델 재학습
├── hand_tracker.py          # Mediapipe 기반 손 랜드마크 추출
├── data_collector.py        # (개발자용) 300프레임 연속 수어 수집 스크립트
├── test.py                  # (디버깅용)
│
├── utils/
│   └── landmark_utils.py    # 랜드마크 정규화, 시퀀스 변환 등 유틸 함수
│
├── model/
│   ├── trainer.py           # LSTM 모델 정의 및 학습 함수
│   ├── predictor.py         # 저장된 모델 기반 추론 수행 모듈
│   └── model.pth            # 저장된 학습 모델 파라미터
│
├── data/                    # 수집된 수어 시퀀스 데이터 (.npy)
├── fonts/
│   └── NanumGothicBold.ttf  # PIL 기반 말풍선 한글 렌더링용 폰트
├── communication2.png       # GUI 상단 로고 이미지
├── requirements.txt         # 의존 라이브러리 명세
└── README.md                

프로그램 사용 순서 (사용자 가이드)

  1. 프로그램 실행

python gui_launcher.py 명령어로 GUI를 실행합니다.

  1. 새로운 수어 라벨 입력

텍스트 입력창에 추가하고자 하는 수어 이름(예: 감사합니다, 안녕하세요)을 입력합니다.

  1. 수어 데이터 수집

"➕ 추가하기" 버튼 클릭 → 카메라가 켜지고, 각 수어에 대해 10개의 시퀀스(30프레임씩)가 자동 수집됩니다.

🔁 모델 자동 재학습

수어 데이터 수집이 끝나면, 프로그램이 자동으로 LSTM 모델을 재학습합니다.

  1. 실시간 인식 실행

"▶ CAM START" 버튼 클릭 → 실시간 카메라 화면에서 수어를 인식하고, 인식된 단어가 말풍선으로 출력됩니다.

  1. 프로그램 종료

GUI 창의 "종료하기" 버튼을 클릭하면 실시간 인식이 종료됩니다.

프로그램의 목적

수어(수화) 인식 기술을 실습을 통해 구현, 실시간 카메라 입력 기반 예측, 사용자 주도 수어 추가 및 모델 재학습, 한글 기반 시각적 피드백 제공, 등의 기능을 갖춘 수어 인식 시스템을 완성하는 것이 본 프로젝트의 목표입니다.

실행 방법

1. 필수 라이브러리 설치

pip install -r requirements.txt

2. GUI 실행

python gui_launcher.py

새로운 수어 모션을 추가하고, 자동으로 데이터 수집 및 모델 재학습이 수행할 수 있음.

수어 추가하기

demo4 demo3

입력해둔 수어 모션 데이터를 바탕으로, 실시간 수어 해석 프로그램을 실시할 수 있음. demo2 캠 실행에 약간의 대기가 필요하여 안내 문구를 넣음. demo1

결과) 실시간 수어 해석 데모 영상

demo5.mp4

파일 별별 주요 기능 설명

🔹 main.py

  • 실시간 카메라 영상에서 손을 추적하고, LSTM 모델을 통해 수어를 예측
  • 예측 결과를 영상 위에 말풍선 형태로 표시 (PIL + OpenCV + 한글 폰트)
  • GUI 창 구성: CustomTkinter 기반, 종료 버튼 포함

🔹 gui_launcher.py

  • 사용자로부터 수어 이름을 입력받아 batch_collector.pyauto_retrain.py를 자동 호출
  • 실시간 인식 기능(main.py) 실행 가능
  • GUI 구성: 텍스트 입력창 + 버튼 2개 (수어 추가, CAM 실행)

🔹 batch_collector.py

  • 지정된 수어 라벨에 대해 10개의 시퀀스를 수집 (각 시퀀스는 30프레임)
  • 프레임마다 손 관절 좌표를 정규화하고 .npy로 저장
  • 데이터는 data/ 폴더에 {label}_{timestamp}.npy 형식으로 저장됨

🔹 auto_retrain.py

  • data/ 폴더의 모든 수어 데이터를 불러와 LSTM 모델을 재학습
  • 모델 학습 후 model.pth로 저장, 라벨 인코더 포함

🔹 hand_tracker.py

  • Mediapipe를 이용해 21개 손 랜드마크를 추출
  • (x, y, z) 좌표로 반환하고, 손 구조를 OpenCV로 시각화 가능

🔹 utils/landmark_utils.py

  • 랜드마크를 기준점 중심으로 정규화 → LSTM 입력 형식으로 평탄화 (30, 63) 시퀀스 생성

🔹 model/trainer.py

  • LSTM 기반 수어 분류 모델 정의 (LSTMClassifier)
  • 학습 함수 train_model() 제공: CrossEntropyLoss + Adam Optimizer
  • LabelEncoder를 함께 저장하여 예측 시 매핑 가능

🔹 model/predictor.py

  • 저장된 모델을 로드하고 단일 시퀀스를 입력받아 예측값 출력 (predict())
  • 이진 분류 또는 다중 클래스 분류에 대응 가능

🔹 data_collector.py (개발자 참고용)

  • 300프레임 연속 수어 데이터를 수집하는 실험용 스크립트
  • GUI 미연동 / 고정된 라벨 사용

requirements.txt

numpy==1.24.3
opencv-python==4.9.0.80
mediapipe==0.10.3
torch==2.2.1
scikit-learn==1.3.2
customtkinter==5.2.1
Pillow==10.2.0

주의사항 및 필수 리소스

  • fonts/NanumGothicBold.ttfcommunication2.png는 GUI 및 말풍선 출력에 필수
  • .bat 파일 없이도 GUI만으로 수어 추가 → 모델 학습 → 실시간 인식까지 모두 가능

🌱 향후 발전 방향

  • ✅ 양손 인식 기능 추가 (현재는 단일 손 기반으로, 수어의 종류가 많아질수록 인식 정확도가 떨어짐)
  • ✅ 속도 벡터 기반 제스처 방향 인식 추가
  • ✅ 프레임 지연 최소화를 위한 병렬 처리 도입
  • ✅ 다양한 해상도 및 카메라 환경 대응을 위한 자동 보정 기능 추가
  • ✅ GUI에 수어별 테스트 버튼 및 정확도 확인 기능 추가

data에 등록해둔 수어 리스트

  • 반가워요/즐거워요
  • 안녕하세요
  • 만나다

모든 수어는 30프레임 x 10세트로 data파일에 입력됨


한계점 및 힘들었던 점

항목 설명
인식 정확도 데이터 수(입력해둔 프레임의 수)가 적어서 인식 오류 발생 가능
손 외 환경 변수 배경, 조명, 거리의 영향을 받음
단일 손 기반 현재 프로젝트에서는 양손 수어는 지원하지 못함
모델 저장 오류 label_encoder 포함 시 torch.load() 오류 발생 (UnpicklingError)
GUI 환경 오류 가상환경 경로 설정 안 되어 있을 경우 torch 인식 실패
불확실한 인식 필터링 confidence가 낮은 경우 말풍선 미출력 기능 구현 (입력할 수 있는 data의 프레임 수가 충분하지 않으니, 현재 수준에서는 손 모션 인식도를 높여둠. 그만큼 인식 오류를 발생하게 되었음)

향후 발전 방향

본 프로젝트는 현재 개인의 실시간 캠 기반 수어 인식 시스템으로 구축됨으로써 부족한 부분이 많음

항목 설명
✅ 양손 인식 확장 Mediapipe에서 왼손/오른손 모두 추적 처리
✅ 수어 문장 인식 단어만이 아닌, 부사 형용사 등의 추가로, 자연스러운 문장 만들 수 있또록
✅ confidence 시각화 예측 확신도가 낮을 경우 흐리게 출력하거나 생략
✅ 웹 기반 앱화 Streamlit 또는 Flask 기반 웹 수어 인식 시스템
✅ 데이터 증강 수어마다 다양한 손모양/방향/속도로 수집 후 증강 기법 적용
  1. 영상통화 기반 실시간 수어 통역 시스템 WebRTC 또는 Zoom SDK 등을 활용하여 영상 통화 중 수어를 인식하고 자동 통역하는 기능.

영상통화 참여자 간에 음성/수어의 양방향 변환 가능성 제시.

  1. 멀티유저 수어 인식 여러 사용자의 손 제스처를 동시에 인식하는 기능 (멀티 핸드 트래킹).

다양한 카메라 각도 및 배경에서도 견고하게 동작하도록 일반화된 인식 모델 도입.

  1. 텍스트 음성 합성 (TTS) 연동 인식된 수어를 단순 텍스트 출력에 그치지 않고, 음성으로 변환하여 청각장애인 외 일반 사용자와의 원활한 의사소통 가능.

  2. 모바일 또는 웹 기반 시스템으로 확장 React Native, Flutter, 또는 WebAssembly 기반으로 시스템 포팅.

브라우저 기반 수어 인식 서비스로의 확장 고려.

  1. 문장 수준의 연속 수어 인식 현재 단일 수어 단어 인식에서 나아가, 시간적 흐름을 고려한 문장 단위 수어 인식 기능 구현.

LSTM, Transformer 기반 시계열 문장 해석 고도화.

어려웠던 점 및 해결 사례

  • PyTorch torch.save()torch.load() 간 label_encoder 포함 시 Unpickling 오류 발생 → 해결: weights_only=False 옵션 또는 encoder 따로 저장
  • GUI에서 python 실행 시 venv 경로가 무시됨 → 해결: sys.executable 또는 venv/Scripts/python.exe 경로를 명시
  • 손의 작은 흔들림도 다른 수어로 인식됨 → 해결: 최근 예측 값을 5초간 유지하도록 보완
  • confidence 낮은 입력에 대해서도 텍스트가 출력됨 → 해결: confidence < 0.8일 경우 말풍선 출력 생략

✨ 마무리

이 프로젝트는 수어를 손쉽게 인식하고 누구나 수어 데이터를 직접 추가할 수 있는 구조를 갖춘 실시간 인식 도구입니다. 수어 사용자가 딱딱한 텍스트가 아닌 실시간 영상으로도 표정, 몸짓을 함께 담아 더욱 자유로운 소통이 가능해지길 바라는 마음으로 만든 프로젝트입니다.

— 모두가 더 나은 소통을 위한 기술에 접근할 수 있기를 바랍니다.

About

이 프로젝트는 단일 손 기반 수어 동작을 실시간으로 인식하고, 인식된 결과를 영상 위에 말풍선 형태로 시각화하는 컴퓨터 비전 프로그램입니다. 사용자는 GUI를 통해 새로운 수어 데이터를 직접 수집하고, 버튼 클릭 만으로 모델을 자동 재학습한 뒤 바로 실시간 인식까지 수행할 수 있습니다.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages