손 제스처 인식을 활용한 AIoT 컨트롤 시스템

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 기기와의 연동 기능을 더욱 강화