본 프로젝트는 단일 손 수어를 실시간으로 인식하고 그 결과를 말풍선 형태로 시각화하는 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
- 프로그램 실행
python gui_launcher.py 명령어로 GUI를 실행합니다.
- 새로운 수어 라벨 입력
텍스트 입력창에 추가하고자 하는 수어 이름(예: 감사합니다, 안녕하세요)을 입력합니다.
- 수어 데이터 수집
"➕ 추가하기" 버튼 클릭 → 카메라가 켜지고, 각 수어에 대해 10개의 시퀀스(30프레임씩)가 자동 수집됩니다.
🔁 모델 자동 재학습
수어 데이터 수집이 끝나면, 프로그램이 자동으로 LSTM 모델을 재학습합니다.
- 실시간 인식 실행
"▶ CAM START" 버튼 클릭 → 실시간 카메라 화면에서 수어를 인식하고, 인식된 단어가 말풍선으로 출력됩니다.
- 프로그램 종료
GUI 창의 "종료하기" 버튼을 클릭하면 실시간 인식이 종료됩니다.
수어(수화) 인식 기술을 실습을 통해 구현, 실시간 카메라 입력 기반 예측, 사용자 주도 수어 추가 및 모델 재학습, 한글 기반 시각적 피드백 제공, 등의 기능을 갖춘 수어 인식 시스템을 완성하는 것이 본 프로젝트의 목표입니다.
pip install -r requirements.txt
python gui_launcher.py
새로운 수어 모션을 추가하고, 자동으로 데이터 수집 및 모델 재학습이 수행할 수 있음.
입력해둔 수어 모션 데이터를 바탕으로, 실시간 수어 해석 프로그램을 실시할 수 있음.
캠 실행에 약간의 대기가 필요하여 안내 문구를 넣음.
demo5.mp4
- 실시간 카메라 영상에서 손을 추적하고, LSTM 모델을 통해 수어를 예측
- 예측 결과를 영상 위에 말풍선 형태로 표시 (PIL + OpenCV + 한글 폰트)
- GUI 창 구성: CustomTkinter 기반, 종료 버튼 포함
- 사용자로부터 수어 이름을 입력받아
batch_collector.py
와auto_retrain.py
를 자동 호출 - 실시간 인식 기능(
main.py
) 실행 가능 - GUI 구성: 텍스트 입력창 + 버튼 2개 (수어 추가, CAM 실행)
- 지정된 수어 라벨에 대해 10개의 시퀀스를 수집 (각 시퀀스는 30프레임)
- 프레임마다 손 관절 좌표를 정규화하고
.npy
로 저장 - 데이터는
data/
폴더에{label}_{timestamp}.npy
형식으로 저장됨
data/
폴더의 모든 수어 데이터를 불러와 LSTM 모델을 재학습- 모델 학습 후
model.pth
로 저장, 라벨 인코더 포함
- Mediapipe를 이용해 21개 손 랜드마크를 추출
- (x, y, z) 좌표로 반환하고, 손 구조를 OpenCV로 시각화 가능
- 랜드마크를 기준점 중심으로 정규화 → LSTM 입력 형식으로 평탄화
(30, 63)
시퀀스 생성
- LSTM 기반 수어 분류 모델 정의 (
LSTMClassifier
) - 학습 함수
train_model()
제공: CrossEntropyLoss + Adam Optimizer - LabelEncoder를 함께 저장하여 예측 시 매핑 가능
- 저장된 모델을 로드하고 단일 시퀀스를 입력받아 예측값 출력 (
predict()
) - 이진 분류 또는 다중 클래스 분류에 대응 가능
- 300프레임 연속 수어 데이터를 수집하는 실험용 스크립트
- GUI 미연동 / 고정된 라벨 사용
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.ttf
와communication2.png
는 GUI 및 말풍선 출력에 필수.bat
파일 없이도 GUI만으로 수어 추가 → 모델 학습 → 실시간 인식까지 모두 가능
- ✅ 양손 인식 기능 추가 (현재는 단일 손 기반으로, 수어의 종류가 많아질수록 인식 정확도가 떨어짐)
- ✅ 속도 벡터 기반 제스처 방향 인식 추가
- ✅ 프레임 지연 최소화를 위한 병렬 처리 도입
- ✅ 다양한 해상도 및 카메라 환경 대응을 위한 자동 보정 기능 추가
- ✅ GUI에 수어별 테스트 버튼 및 정확도 확인 기능 추가
- 반가워요/즐거워요
- 안녕하세요
- 만나다
모든 수어는 30프레임 x 10세트로 data파일에 입력됨
항목 | 설명 |
---|---|
인식 정확도 | 데이터 수(입력해둔 프레임의 수)가 적어서 인식 오류 발생 가능 |
손 외 환경 변수 | 배경, 조명, 거리의 영향을 받음 |
단일 손 기반 | 현재 프로젝트에서는 양손 수어는 지원하지 못함 |
모델 저장 오류 | label_encoder 포함 시 torch.load() 오류 발생 (UnpicklingError) |
GUI 환경 오류 | 가상환경 경로 설정 안 되어 있을 경우 torch 인식 실패 |
불확실한 인식 필터링 | confidence가 낮은 경우 말풍선 미출력 기능 구현 (입력할 수 있는 data의 프레임 수가 충분하지 않으니, 현재 수준에서는 손 모션 인식도를 높여둠. 그만큼 인식 오류를 발생하게 되었음) |
본 프로젝트는 현재 개인의 실시간 캠 기반 수어 인식 시스템으로 구축됨으로써 부족한 부분이 많음
항목 | 설명 |
---|---|
✅ 양손 인식 확장 | Mediapipe에서 왼손/오른손 모두 추적 처리 |
✅ 수어 문장 인식 | 단어만이 아닌, 부사 형용사 등의 추가로, 자연스러운 문장 만들 수 있또록 |
✅ confidence 시각화 | 예측 확신도가 낮을 경우 흐리게 출력하거나 생략 |
✅ 웹 기반 앱화 | Streamlit 또는 Flask 기반 웹 수어 인식 시스템 |
✅ 데이터 증강 | 수어마다 다양한 손모양/방향/속도로 수집 후 증강 기법 적용 |
- 영상통화 기반 실시간 수어 통역 시스템 WebRTC 또는 Zoom SDK 등을 활용하여 영상 통화 중 수어를 인식하고 자동 통역하는 기능.
영상통화 참여자 간에 음성/수어의 양방향 변환 가능성 제시.
- 멀티유저 수어 인식 여러 사용자의 손 제스처를 동시에 인식하는 기능 (멀티 핸드 트래킹).
다양한 카메라 각도 및 배경에서도 견고하게 동작하도록 일반화된 인식 모델 도입.
-
텍스트 음성 합성 (TTS) 연동 인식된 수어를 단순 텍스트 출력에 그치지 않고, 음성으로 변환하여 청각장애인 외 일반 사용자와의 원활한 의사소통 가능.
-
모바일 또는 웹 기반 시스템으로 확장 React Native, Flutter, 또는 WebAssembly 기반으로 시스템 포팅.
브라우저 기반 수어 인식 서비스로의 확장 고려.
- 문장 수준의 연속 수어 인식 현재 단일 수어 단어 인식에서 나아가, 시간적 흐름을 고려한 문장 단위 수어 인식 기능 구현.
- 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일 경우 말풍선 출력 생략
이 프로젝트는 수어를 손쉽게 인식하고 누구나 수어 데이터를 직접 추가할 수 있는 구조를 갖춘 실시간 인식 도구입니다. 수어 사용자가 딱딱한 텍스트가 아닌 실시간 영상으로도 표정, 몸짓을 함께 담아 더욱 자유로운 소통이 가능해지길 바라는 마음으로 만든 프로젝트입니다.
— 모두가 더 나은 소통을 위한 기술에 접근할 수 있기를 바랍니다.