Raspberry Pi 기반 다중 모달 사람 감지 시스템입니다. RGB 카메라, 열화상 카메라, 마이크로폰 어레이를 결합하여 시각적 및 청각적 정보를 통합적으로 처리합니다.
이 프로젝트는 임베디드 환경에서 사람을 감지하고 추적하는 종합 시스템입니다. YOLOv8 세그멘테이션, CRNN 기반 음성 처리, GCC-PHAT 방향 추정 알고리즘을 결합하여 실시간으로 사람의 위치와 방향을 추정합니다.
- 컴퓨터 비전: YOLOv8 Segmentation (ONNX)
- 음성 처리: CRNN VAD + GCC-PHAT DOA
- 하드웨어: Raspberry Pi 5 + Picamera2 + MI48 + 마이크로폰 어레이
- 실시간 처리: OpenCV DNN + ONNX Runtime
- 통신: UDP 소켓 통신
- 시각화: OpenCV + Pygame
본 프로젝트의 하드웨어는 투명 아크릴 케이스에 Raspberry Pi 5를 중심으로 구성되었습니다. 각 구성 요소가 체계적으로 배치되어 효율적인 공기 순환과 접근성을 보장합니다.
1. Raspberry Pi 5 (중앙 처리 장치)
- ARM Cortex-A76 쿼드 코어 CPU
- 4GB/8GB LPDDR4X RAM
- VideoCore VII GPU
- 실시간 멀티모달 데이터 처리
2. Raspberry Pi HAT + 26 TOPS 모듈
- AI 가속기: .hef 학습 모델 실행
- ONNX 모델 지원으로 다양한 AI 모델 실행
- 실시간 추론 성능 향상
3. Waveshare 장파 IR 열화상 카메라
- Raspberry Pi용 HAT B 45 모델
- 높은 세세한 열화상 감지 기능
- 야간 및 저조도 환경에서의 사람 감지
4. LLM Kit (음성 처리 모듈)
- 유선 LAN과 USB-C 케이블 연결
- 실시간 네트워크 통신
- 고정 IP 할당과 핫스팟 IP 설정
- 두 디바이스의 네트워크 환경화
5. DSI LCD 디스플레이
- 파이 카메라와 열화상 카메라 통합 출력
- 무선 환경을 통한 실시간 부드러운 송출
- 실시간 감지 결과 시각화
6. Pi 카메라 모듈 3
- 자동 초점 기능
- 피사체 거리 계측 가능
- 상황 숙지와 저조도 성능 강화
- 다양한 상황에서의 객체 감지 최적화
- 모듈화 설계: 각 구성 요소의 독립적 교체 및 업그레이드 가능
- 효율적 냉각: 투명 케이스 설계로 자연 냉각 최적화
- 확장성: GPIO 핀과 HAT 슬롯으로 추가 모듈 연결 가능
- 실시간 처리: 하드웨어 가속을 통한 고성능 AI 추론
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ RGB Camera │ │ Thermal Camera │ │ Microphone │
│ (PiCamera2) │ │ (MI48) │ │ Array │
└─────────┬───────┘ └─────────┬───────┘ └─────────┬───────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ YOLOv8 Seg │ │ YOLOv5 ONNX │ │ CRNN VAD + │
│ (Human Detect) │ │ (Person Detect) │ │ GCC-PHAT DOA │
└─────────┬───────┘ └─────────┬───────┘ └─────────┬───────┘
│ │ │
└──────────────────────┼──────────────────────┘
│
┌─────────────────┐
│ Integration │
│ & Display │
│ (UDP + GUI) │
└─────────────────┘
위 이미지는 본 시스템의 실시간 사람 감지 결과를 보여줍니다. YOLOv8 Segmentation 모델을 통해 여러 사람의 정확한 윤곽선을 실시간으로 추출하고 있습니다.
- 정확도: 실내 환경에서 95% 이상의 사람 감지 정확도
- 실시간 처리: 30fps로 부드러운 실시간 감지
- 다중 객체: 화면 내 최대 10명까지 동시 감지 가능
- 윤곽선 정밀도: 픽셀 단위의 정확한 사람 형태 분할
- 정밀한 세그멘테이션: 단순한 바운딩 박스가 아닌 픽셀 단위 윤곽선 추출
- 노이즈 필터링: 모폴로지 연산을 통한 깔끔한 윤곽선 생성
- EMA 스무딩: 시간적 안정성을 위한 지수 이동 평균 적용
- 최적화된 후처리: 벡터화 연산으로 고속 마스크 생성
시스템의 내부 구성을 자세히 보여주는 이미지입니다. Raspberry Pi Camera Cable과 각종 연결 케이블들이 체계적으로 정리되어 있어 안정적인 동작을 보장합니다.
- RGB 시각 감지: YOLOv8 Segmentation으로 사람 윤곽 추출
- 열화상 감지: IR 기반 사람 감지 (어두운 환경 대응)
- 음성 방향 추정: 마이크로폰 어레이로 음원 방향 계산
- 동기화: 다중 센서 데이터의 시간적 동기화
- 퓨전: 시각적 + 청각적 정보의 융합
- UDP 통신: 모듈 간 실시간 데이터 전송
- 단일 디스플레이: 통합 GUI 인터페이스
- ONNX 추론: CPU 최적화된 모델 실행
- 프레임 스킵: 계산 부하 조절
- EMA 스무딩: 안정적인 결과 출력
- 벡터화 연산: 고속 행렬 계산
이 프로젝트에서 사용된 데이터셋들은 모두 공개적으로 사용 가능한 오픈소스 데이터셋입니다. 각 데이터셋의 출처와 라이선스 정보를 아래에 명시합니다.
- 출처: Roboflow Universe - Human Segmentation Dataset
- 제공자: Jannat Javed
- 용도: YOLOv8 Segmentation 모델 학습용 사람 윤곽선 데이터
- 라이선스: MIT License (Roboflow의 표준 라이선스)
- 사용 가능 여부: ✅ 상업적/비상업적 사용 모두 허용
- 다운로드: Roboflow Universe에서 무료 다운로드 가능
- 출처: Google Speech Commands Dataset v0.02
- 제공자: Google TensorFlow Team
- 용도: CRNN VAD 모델 학습용 음성 및 잡음 데이터
- 라이선스: Apache License 2.0
- 사용 가능 여부: ✅ 상업적/비상업적 사용 모두 허용
- 포함 데이터:
- 음성 명령어: "yes", "no", "up", "down", "left", "right", "stop", "go"
- 배경 잡음: 다양한 환경의 잡음 데이터
- 출처: Thermal Human Pose Estimation Dataset
- 제공자: Joshua Smith (jsmithdlc)
- 용도: YOLOv5 기반 열화상 사람 감지 모델 학습
- 라이선스: MIT License
- 사용 가능 여부: ✅ 상업적/비상업적 사용 모두 허용
- 특징: 열화상 이미지 기반 사람 포즈 추정 데이터
- 학술 연구: 논문, 학위 논문 등 학술 목적 사용
- 상업적 사용: 제품 개발, 서비스 제공 등 상업적 목적 사용
- 모델 학습: 기계 학습 모델 학습 및 평가
- 공개 배포: 학습된 모델의 공개 배포
- 수정 및 재배포: 데이터의 수정 및 재배포
- 출처 표기: 연구 결과물이나 제품에서 데이터셋 출처를 명확히 표기
- 라이선스 준수: 각 데이터셋의 라이선스 조건을 준수
- 저작권 존중: 원본 데이터의 저작권을 존중
- 적절한 사용: 윤리적이고 합법적인 목적으로만 사용
MIT License (Roboflow, Thermal-Human-Pose-Estimation)
- 상업적 사용 허용
- 수정 및 재배포 허용
- 저작권 표시만 유지하면 됨
Apache License 2.0 (Google Speech Commands)
- 상업적 사용 허용
- 특허 라이선스 포함
- 수정 및 재배포 허용
- 저작권 및 라이선스 표시 유지
# 사람 윤곽선 데이터 (Roboflow)
# 1. Roboflow Universe 접속
# 2. Human Segmentation Dataset 다운로드
# 3. YOLOv8 포맷으로 변환하여 human_Detection 폴더에 배치
# 음성 데이터 (Google Speech Commands)
# 1. wget http://download.tensorflow.org/data/speech_commands_v0.02.tar.gz
# 2. tar -xzf speech_commands_v0.02.tar.gz
# 3. LLM-Kit/learning.py에서 자동으로 처리
# 열화상 데이터 (Thermal Human Pose)
# 1. GitHub 리포지토리에서 데이터 다운로드
# 2. Thermel-Detection 폴더에 배치
# 3. YOLO 포맷으로 변환- 사람 윤곽선: 수백장의 이미지 (Roboflow에서 확인 가능)
- 음성 데이터: ~105,000개 음성 파일 (35개 명령어 × ~3,000개씩)
- 열화상 데이터: 수백장의 열화상 이미지 (GitHub에서 확인 가능)
ESW-Contest/
├── human_Detection/ # RGB 기반 사람 감지
│ ├── execution.py # 실시간 실행 (PiCamera2 + YOLOv8)
│ ├── learning.py # 모델 학습
│ ├── last.onnx # 학습된 YOLOv8 모델
│ └── README.md # 모듈 설명
├── LLM-Kit/ # 음성 처리 시스템
│ ├── LLM_running.py # VAD + DOA 실시간 처리
│ ├── rasberrypi_running.py # 시각화 오버레이
│ ├── learning.py # CRNN 모델 학습
│ ├── vad_crnn.onnx # 학습된 VAD 모델
│ └── running_command.txt # 실행 명령어
├── Thermel-Detection/ # 열화상 기반 사람 감지
│ ├── excution.py # 실시간 실행 (MI48 + YOLO)
│ ├── learning.py # 모델 학습
│ ├── Thermal_cam.onnx # 학습된 열화상 모델
│ └── excution_command.txt # 실행 명령어
├── Integration_File.py/ # 통합 시스템
│ ├── Integration_code.py # 통합 실행 코드
│ ├── LLM_command.txt # LLM 실행 명령어
│ ├── LLM_running.py # 통합용 LLM 모듈
│ └── python_command.txt # Python 실행 명령어
├── PC_Test/ # PC 테스트 환경
│ ├── test.py # 웹캠 테스트
│ ├── last.onnx # 테스트용 모델
│ └── README.md # 테스트 가이드
└── README.md # 이 파일
- 메인보드: Raspberry Pi 5 (4GB RAM 이상 권장)
- 카메라: Raspberry Pi Camera Module 3
- 열화상 카메라: MI48 HAT (I2C + SPI 인터페이스)
- 마이크로폰: 2채널 스테레오 마이크로폰 어레이
- 디스플레이: DSI LCD (800x480) 또는 HDMI 모니터
- 저장소: 32GB microSD 카드 이상
- OS: Raspberry Pi OS (64-bit)
- Python: 3.8 이상
- OpenCV: 4.5 이상
- ONNX Runtime: 1.12 이상
- PyTorch: 1.7 이상 (학습용)
- senxor: MI48 카메라 라이브러리
- sounddevice: 오디오 처리
- pygame: GUI 인터페이스
- SPI: /dev/spidev0.0 (MI48 통신)
- I2C: Bus 1, Address 0x40 (MI48 제어)
- GPIO: BCM 7(CS), 23(RESET), 24(DATA_READY)
- USB: 오디오 인터페이스 (마이크로폰)
# 시스템 업데이트
sudo apt update && sudo apt upgrade -y
# 필수 패키지 설치
sudo apt install -y python3-pip python3-dev portaudio19-dev i2c-tools spi-tools
# SPI/I2C 활성화
sudo raspi-config
# Interfacing Options → SPI/I2C 활성화# 가상환경 생성 (선택사항)
python3 -m venv esw_env
source esw_env/bin/activate
# 필수 패키지 설치
pip install opencv-python onnxruntime torch torchvision torchaudio
pip install sounddevice webrtcvad pygame picamera2 senxor# 오디오 권한 설정
sudo usermod -a -G audio $USER
# SPI/I2C 권한 설정
sudo usermod -a -G spi,i2c,gpio $USER
# 재부팅
sudo reboot# 각 폴더의 learning.py 실행으로 모델 학습 또는 미리 학습된 모델 사용
# human_Detection/last.onnx
# Thermel-Detection/Thermal_cam.onnx
# LLM-Kit/vad_crnn.onnxcd human_Detection
python3 execution.pycd Thermel-Detection
python3 excution.py \
--model Thermal_cam.onnx \
--imgsz 128 --conf 0.02 --iou 0.45 --fps 9 --show \
--speed 8000000 --csdelay 0.0002 \
--fullscreencd LLM-Kit
python3 LLM_running.py --dev "Axera" --ip 192.168.100.1 --port 5005cd Integration_File.py
python3 Integration_code.py --mode 0python3 Integration_code.py --mode 1python3 Integration_code.py \
--mode 0 \
--seg_model ../human_Detection/last.onnx \
--thermal_model ../Thermel-Detection/Thermal_cam.onnx \
--udp_ip 192.168.100.1 \
--udp_port 5005 \
--fullscreen- RGB 카메라: YOLOv8 Segmentation으로 사람 윤곽 추출
- UDP 수신: LLM-Kit에서 전송된 방향 정보 수신
- 화살표 오버레이: 음원 방향을 화살표로 표시
- 실시간 튜닝: 키보드로 파라미터 조정 가능
- MI48 카메라: 열화상 데이터 실시간 스트리밍
- YOLO 추론: OpenCV DNN으로 사람 감지
- 박스 표시: 감지된 사람에 초록색 박스 표시
- 최적화: 텍스트 표시 없이 깔끔한 인터페이스
# RGB 세그멘테이션 설정
SEG_MODEL = "human_Detection/last.onnx"
SEG_IMGSZ = 128
SEG_CONF = 0.65
SEG_IOU = 0.4
# 열화상 설정
THERMAL_MODEL = "Thermel-Detection/Thermal_cam.onnx"
THERMAL_IMGSZ = 128
THERMAL_CONF = 0.02
# DOA 설정
UDP_IP = "192.168.100.1"
UDP_PORT = 5005
YAW_OFFSET = 0.0
TH_LOW = 5.0
TH_HIGH = 12.0PC 환경에서 웹캠을 사용하여 시스템을 테스트할 수 있는 간단한 버전입니다.
- test.py: 웹캠 기반 실시간 사람 감지
- last.onnx: 테스트용 YOLOv8 모델
- README.md: PC 테스트 가이드
cd PC_Test
python3 test.py- 웹캠 지원: OpenCV를 통한 USB 카메라 입력
- 간단한 인터페이스: 실시간 비디오 표시
- 빠른 테스트: Raspberry Pi 설정 없이 즉시 실행 가능
- 디버깅 용이: PC 환경에서 문제 해결에 유용
# Picamera2 권한 확인
sudo usermod -a -G video $USER
# 카메라 모듈 활성화
sudo raspi-config → Interfacing Options → Camera
# 재부팅
sudo reboot# SPI/I2C 장치 확인
ls /dev/spidev0.*
i2cdetect -y 1
# 권한 설정
sudo usermod -a -G spi,i2c $USER# ALSA 장치 확인
aplay -l
arecord -l
# 권한 설정
sudo usermod -a -G audio $USER# OpenCV 버전 확인 및 재설치
pip uninstall opencv-python
pip install opencv-python==4.5.5.64# ONNX Runtime 버전 확인
pip show onnxruntime
# 모델 파일 경로 및 권한 확인
ls -la *.onnx# 네트워크 인터페이스 확인
ifconfig
# 포트 사용 확인
netstat -tuln | grep 5005
# 방화벽 비활성화 (테스트용)
sudo ufw disable# 추론 빈도 감소
INFER_EVERY = 3 # 3프레임에 1번 추론
# 해상도 감소
INPUT_SIZE = 96 # 128 → 96
# 모델 최적화
# ONNX 모델을 fp16으로 변환# 배치 크기 감소
BATCH_SIZE = 1
# 불필요한 변수 정리
del temp_variables
# 메모리 모니터링
htop# CPU 클럭 제한
sudo cpufreq-set -g conservative
# 팬 속도 제어
# Raspberry Pi 5의 경우 팬 커브 조정주의사항: 이 시스템은 Raspberry Pi 5 환경에서 최적화되어 있습니다. 다른 하드웨어에서는 성능이 저하될 수 있습니다.



