1. 프로젝트 제작 동기
이 프로젝트는 AI와 IoT 기술을 융합하여 손 제스처를 인식하고 이를 활용하여 다양한 기기를 제어할 수 있도록 하는 것을 목표로 합니다. 스마트 홈 환경에서 버튼을 누르거나 음성 명령을 사용하지 않고도 직관적인 손동작만으로 기기를 조작할 수 있다면 편의성이 크게 향상될 것입니다. 또한, 물리적 접촉 없이 제어가 가능하므로 위생적인 측면에서도 유리합니다. 이러한 필요성을 바탕으로 우리는 컴퓨터 비전과 딥러닝 기술을 이용하여 손 제스처를 실시간으로 인식하고, 이를 활용해 PC, 조명, 음악 플레이어 등 다양한 IoT 기기를 제어하는 AI 모델을 개발하기로 했습니다.
2. 프로젝트 설명
2.1 개요
이 프로젝트에서는 CNN(Convolutional Neural Network) 기반의 딥러닝 모델을 활용하여 손 제스처를 인식하는 시스템을 개발했습니다. 데이터셋으로는 직접 촬영한 손 제스처 이미지와 공개 데이터셋을 조합하여 사용하였으며, 이를 활용해 모델을 학습시켰습니다.
2.2 기술적 접근 방법
본 프로젝트는 OpenCV와 MediaPipe를 활용하여 실시간으로 손의 랜드마크를 추출하고, CNN 모델을 이용하여 제스처를 분류한 후, PyAutoGUI를 활용하여 PC 및 IoT 기기 제어 명령을 수행하도록 설계되었습니다.
- 손 랜드마크 감지: MediaPipe를 사용하여 손의 특징점(랜드마크)을 추출
- 데이터 증강: 다양한 환경에서의 인식 성능 향상을 위해 데이터 증강 기법 적용
- CNN 모델 학습: 딥러닝 모델을 사용하여 손 제스처를 분류
- 실시간 제어 기능 구현: OpenCV 및 PyAutoGUI를 이용한 IoT 기기 연동
3. 코드
3.1 손 랜드마크 감지 코드
MediaPipe의 Hands
모듈을 사용하여 손의 랜드마크를 감지하고 특징을 추출합니다.
import cv2
import mediapipe as mp
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils
cap = cv2.VideoCapture(0)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
result = hands.process(image)
if result.multi_hand_landmarks:
for hand_landmarks in result.multi_hand_landmarks:
mp_draw.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
cv2.imshow("Hand Tracking", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
3.2 데이터 증강 코드
이미지 데이터를 변형하여 모델의 일반화 성능을 높입니다.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
data_gen = ImageDataGenerator(
rotation_range=30,
width_shift_range=0.2,
height_shift_range=0.2,
zoom_range=0.2,
horizontal_flip=True
)
3.3 CNN 모델 학습 코드
손 제스처를 분류하는 CNN 모델을 설계하고 학습합니다.
import tensorflow as tf
from tensorflow.keras import layers, models
model = models.Sequential([
layers.Conv2D(32, (3,3), activation='relu', input_shape=(64, 64, 3)),
layers.MaxPooling2D((2,2)),
layers.Conv2D(64, (3,3), activation='relu'),
layers.MaxPooling2D((2,2)),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dense(5, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))
3.4 PyAutoGUI를 활용한 제어 코드
손 제스처를 인식하여 PC 및 IoT 기기를 제어합니다.
import pyautogui
def control_device(gesture):
if gesture == "open_hand":
pyautogui.press('space') # 음악 재생/정지
elif gesture == "fist":
pyautogui.press('volumeup') # 볼륨 증가
elif gesture == "thumbs_up":
pyautogui.press('volumedown') # 볼륨 감소
4. 시연 영상
- 실시간 손 제스처 인식을 활용한 IoT 기기 제어 시연 영상
- 음악 플레이어, 조명 제어 등의 기능이 포함된 데모 영상
5. 프로젝트 결과 및 향후 계획
5.1 주요 성과
- 손 제스처 인식 정확도: 다양한 조명 및 환경에서 테스트를 진행하며 조도 변화에 따른 인식 차이를 발견함
- 실시간 제어 기능 구현: OpenCV 및 MediaPipe를 활용하여 실시간 손 제스처 인식 가능
- IoT 기기 연동 성공: 특정 손동작을 통해 음악 재생, 볼륨 조절 등의 기능을 수행
5.2 향후 계획
- 더 다양한 환경에서 데이터를 수집하여 모델의 일반화 성능 향상
- IoT 기기와의 연동 기능을 더욱 강화