MediaPipe · ResNet18 · TTS/STT · Real-time Vision
📌 2026학년도 오픈소스프로그래밍 프로젝트 | 팀명: 오르락 내리락
- Overview
- Background & Motivation
- Key Features
- System Architecture
- Theoretical Background
- System Flow
- Dataset
- Requirements
- Installation & Quick Start
- Results
- Limitations
- Project Structure
- Team
SafeStep은 고령자의 낙상 사고를 실시간으로 감지하고, 사고 발생 장소(계단/평지) 에 따라 차별화된 응급 대응을 자동으로 수행하는 지능형 시스템입니다.
기존 낙상 감지 기술의 한계:
- ❌ 단순히 '넘어짐' 자체만 판단 — 장소의 위험도를 고려하지 않음
- ❌ 계단 낙상(중증외상 위험)과 평지 낙상(경미한 경우)을 동일하게 처리
- ❌ 불필요한 행정력 낭비 및 정작 위험한 상황에서의 대응 지연
SafeStep의 해결책:
- ✅ MediaPipe Pose 기반 실시간 관절 추적으로 낙상 즉시 감지
- ✅ ResNet18 CNN 전이 학습으로 계단/평지 자동 분류
- ✅ 장소별 차별화된 TTS/STT 응급 프로토콜 — 계단 낙상 시 즉시 119 신고
질병관리청 「제12차 국가 손상 종합 통계 2020」에 따르면, 60세 이상 입원 환자의 주요 손상기전은 추락·낙상(33.1%) 으로 나타났습니다.
| 통계 | 수치 | 출처 |
|---|---|---|
| 65세 이상 고령자 안전사고 중 낙상 비율 | 47.4% | 한국소비자원 CISS, 2017 |
| 65~84세 낙상 사망원인 중 계단 추락 비율 | 14.9% | 통계청, 2024 |
| 고령자 안전사고 건수 (2016년) | 5,795건 | 한국소비자원 CISS, 2017 |
💡 핵심 인사이트: 평지 낙상은 경미한 경우가 많아 본인 확인 후 대응이 가능하지만,
계단 낙상은 복합골절·뇌손상 등 중증외상으로 이어질 가능성이 높아 즉각적인 응급 대응이 필수입니다.
| Feature | Description |
|---|---|
| 🦴 실시간 낙상 감지 | MediaPipe Pose로 33개 관절 좌표를 실시간 추출하여 낙상 판별 |
| 🏗️ 장소 자동 분류 | ResNet18 CNN 전이 학습으로 계단(위험) / 평지(저위험) 분류 |
| 🔊 양방향 음성 인터랙션 | Google TTS/STT로 낙상 후 사용자 상태 확인 및 자동 응답 |
| 🚨 차별화된 응급 프로토콜 | 계단 낙상 시 즉시 119 및 보호자 긴급 알림 자동 전송 |
| 📊 실시간 모니터링 대시보드 | 낙상 발생 시간, 장소, 대응 현황 실시간 표시 |
SafeStep은 3개의 독립 모듈이 유기적으로 연동되는 파이프라인 구조입니다.
[웹캠 실시간 영상 입력]
│
▼
┌─────────────────────┐ ┌──────────────────────┐
│ Module 2 │────▶│ Module 1 │
│ 장소 분류 (CNN) │ │ 낙상 감지 │
│ ResNet18 │ │ (MediaPipe Pose) │
└─────────────────────┘ └──────────┬───────────┘
│ 낙상 감지 시
▼
┌──────────────────────┐
│ Module 3 │
│ TTS/STT 인터랙션 │
│ + 자동 신고 │
└──────────────────────┘
MediaPipe Pose는 Google이 개발한 실시간 인체 자세 추정 라이브러리로,
단일 RGB 카메라 영상에서 33개의 신체 랜드마크(관절 좌표) 를 실시간으로 추출합니다.
SafeStep은 아래 3가지 조건을 동시에 만족할 때 낙상으로 판정합니다.
정상 기립 상태에서는 골반(hip)의 Y좌표가 무릎(knee)보다 항상 위에 위치합니다.
낙상 시 이 관계가 역전됩니다.
어깨(shoulder)와 골반(hip)을 잇는 몸의 중심 라인이 지면과 이루는 각도를 계산합니다.
낙상 시 이 각도가 급격히 감소합니다.
신체를 감싸는 가상의 바운딩 박스(Bounding Box)의 종횡비(Aspect Ratio)를 실시간으로 추적합니다.
정상 상태(세로형)에서 낙상 상태(가로형)로 변할 때 비율이 감소합니다.
최종 판별: 위 3가지 조건이 모두 동시에 만족될 때
Fallen State = True로 판정합니다.
ResNet은 Microsoft Research가 2015년 발표한 딥러닝 모델로,
잔차 연결(Residual Connection, Skip Connection) 을 도입하여
매우 깊은 신경망에서도 기울기 소실(Vanishing Gradient) 문제를 해결한 혁신적인 CNN 구조입니다.
일반 CNN은 입력
ResNet은 여기에 원본 입력
여기서
$\sigma$ 는 ReLU 활성화 함수,$W$ 는 가중치 행렬,$b$ 는 편향(bias)입니다.
SafeStep은 ImageNet으로 사전 학습된 ResNet18 모델의 가중치를 가져와,
마지막 Fully Connected Layer만 계단/평지 2-class 분류에 맞게 교체하여 학습합니다.
이 방식은 적은 데이터셋(346장)으로도 높은 분류 정확도를 달성할 수 있게 합니다.
Google Speech Recognition API를 활용하여 마이크로 입력된 사용자의 음성을 텍스트로 변환합니다.
SpeechRecognition 라이브러리의 동적 주변 노이즈 조절(adjust_for_ambient_noise) 을 적용하여
소음 환경에서도 인식률을 향상시킵니다.
Google TTS(gTTS) 를 활용하여 상황에 맞는 안내 멘트를 자연스러운 한국어 음성으로 변환하고,
pygame으로 재생합니다.
- 평지(저위험): TTS로 상태 확인 → STT로 답변 인식 → 오보 필터링
- 계단(고위험): 즉시 119 및 보호자 긴급 알림 전송
flowchart TD
A[/실시간 영상 입력/] --> B{계단여부 판별}
B -->|위험| C[계단 판별]
B -->|저위험| D[계단 아님]
C --> E[낙상감지 발동]
E -->|낙상 감지| F[TTS,STT]
E -->|낙상 미감지| M[계속 모니터링]
F --> G{응답}
F --> H{무응답}
G -->|괜찮아| I[안전 확인]
G -->|안괜찮아| J[신고]
H --> J
I --> M
J --> M
D --> M
M --> A
팀원 3인이 직접 촬영하여 구축한 자체 데이터셋을 사용합니다.
| 클래스 | 수량 | 특징 |
|---|---|---|
| 🪜 계단 (stairs) | 약 250장 | 나선형·돌계단 등 다양한 형태, 다양한 각도·밝기 |
| 🏞️ 평지 (ground) | 약 96장 | 실내외 평지 환경 |
| 합계 | 346장 | 인당 약 100장 직접 촬영 |
데이터 다양성 확보 전략:
- 📐 다양한 촬영 각도 (정면, 측면, 위에서 아래로 등)
- 💡 다양한 조명 환경 (밝음, 어두움, 역광 등)
- 🏗️ 다양한 계단 유형 (나선형, 돌계단, 실내계단, 야외계단 등)
Python >= 3.8
| 패키지 | 용도 |
|---|---|
opencv-python |
웹캠 영상 입력 및 화면 렌더링 |
mediapipe |
실시간 인체 관절 좌표 추출 (Module 1) |
numpy |
관절 좌표 수치 계산 |
torch |
PyTorch 딥러닝 프레임워크 (Module 2) |
torchvision |
ResNet18 사전학습 모델 로드 |
Pillow |
이미지 전처리 |
pillow-heif |
HEIF/HEIC 확장자 이미지 호환 |
SpeechRecognition |
STT — 음성을 텍스트로 변환 (Module 3) |
gTTS |
TTS — 텍스트를 음성으로 변환 |
pygame |
TTS 음성 파일 재생 |
PyAudio |
마이크 하드웨어 접근 |
터미널(명령 프롬프트)을 열고 아래 명령어로 Git이 설치되어 있는지 확인하세요:
git --versionGit이 없다면 👉 https://git-scm.com/downloads 에서 먼저 설치하세요.
Git Clone이란?
원격 GitHub 저장소의 모든 파일과 코드를 내 컴퓨터로 복사해오는 명령어입니다.
아래 명령어 한 줄로 프로젝트 전체를 내려받을 수 있습니다.
# 원하는 폴더로 이동 후 아래 명령어 입력
git clone https://github.com/lce2005/SafeStep.git
# 클론된 폴더로 이동
cd SafeStep다른 프로젝트와 패키지 충돌을 방지하기 위해 가상환경 사용을 강력히 권장합니다.
Anaconda 사용 시 (권장):
conda create -n safestep python=3.8 -y
conda activate safestepvenv 사용 시:
# 가상환경 생성
python -m venv venv
# 가상환경 활성화
source venv/bin/activate # macOS / Linux
venv\Scripts\activate # Windowspip install -r requirements.txt
⚠️ PyAudio 설치 오류 시 (Windows):pip install pipwin pipwin install pyaudio
⚠️ PyAudio 설치 오류 시 (macOS):brew install portaudio pip install pyaudio
stair_classifier.pth 파일을 프로젝트 루트 디렉토리에 위치시킵니다:
SafeStep/
├── stair_classifier.pth ← 여기에 배치
├── test.py
└── ...
python test.py웹캠이 자동으로 켜지며 실시간 낙상 감지 및 장소 분류가 시작됩니다.
💡 종료: 실행 중
q키를 누르면 종료됩니다.
계단이 아닐 때 / 계단일 때를 나누어 낙상 감지 로직을 실행하고,
낙상 감지 로직에 따라 Fallen State를 정확히 전환합니다.
계단을 바라보는 카메라의 각도가 바뀌어도 안정적으로 실행에 성공했습니다.
| 문제 상황 | 원인 |
|---|---|
낙상 상태인데 Fallen State = False |
특정 자세에서 관절 좌표 3가지 조건 미충족 |
| 응급 상황을 정상으로 잘못 분류 | STT 인식 오류 (소음, 발음 불명확) |
| 한계점 | 상세 내용 |
|---|---|
| 🌙 야간 환경 | MediaPipe는 RGB 카메라(빛)에 의존 — 불이 꺼진 야간 계단이나 어두운 방에서 관절 추출 불가 |
| 🌐 인터넷 의존성 | Google STT/TTS는 클라우드 기반 — 오프라인 환경에서 작동 불가 |
| 🔊 소음 환경 | TV 소리, 계단식 아파트 울림 소음 등이 섞이면 STT 인식률 급격히 저하 |
| ⏱️ 응답 지연 | TTS/STT 처리 시간으로 인해 실제 대화보다 응답 간 지연 발생 |
| 💻 연산 부하 | MediaPipe + ResNet18 동시 실행 시 고성능 GPU 없는 환경에서 30FPS 처리 어려움 |
SafeStep/
├── assets/ # README용 이미지 파일
│ ├── result_success_1.png
│ └── result_success_2.png
│
├── data/ # 학습 데이터셋
│ ├── stair/ # 계단 이미지 (~250장)
│ └── ground/ # 평지 이미지 (~96장)
│
├── stair_classifier.pth # 학습된 ResNet18 모델 가중치
├── convert.py # 데이터 전처리 스크립트
├── test.py # 메인 실행 파일 (통합 모듈)
├── requirements.txt # 의존성 패키지 목록
├── LICENSE
└── README.md
팀명: 오르락 내리락 | 2026학년도 오픈소스프로그래밍
| 역할 | 이름 | 학번 | 담당 모듈 |
|---|---|---|---|
| 팀장 | 이채은 | 2513887 | Module 1 — MediaPipe 낙상 감지 알고리즘, 메인 함수 통합 |
| 팀원 | 김선형 | 2414822 | Module 2 — CNN 장소 분류 (ResNet18 전이 학습) |
| 팀원 | 김영서 | 2512440 | Module 3 — STT/TTS 인터랙션, 긴급 알림, 대시보드 |
공통 작업: 계단·평지·낙상 데이터셋 직접 촬영 (3인 공동)
This project is licensed under the MIT License — see the LICENSE file for details.

