1. 미디어파이프(Mediapipe)를 활용한 AI기능 개발  

 

미디어파이프는 구글에서 주로 인체를 대상으로하는 비전인식기능들을  AI모델 개발과 기계학습까지 마친 상태로 제공하는 서비스이다. 다양한 프로그램언어에서 사용하기 편하게 라이브러리 형태로 모듈화되어 제공되며 사용방법 또한 풍부하게 제공되기 때문에 몇가지 간단한 단계로 미디어파이프에서 제공하는 AI기능을 활용한 응용 프로그램개발이 가능하다. 여기에서는 Python언어로 손가락 동작을 인식하는 AI프로그램을 개발하는 과정에 대해 정리한다. 

 

2. 미디어파이프 설치 

 

Python 개발환경이 설치되어 있다면 단순히 mediapipe 모듈을 설치하기만 하면 된다. 즉, "pip install mediapipe" 명령을 입력하여 설치하기만 하면  Python프로그램에서 "import mediapipe"문장으로 호출하여 Mediapipe 기능을  전부 사용할 수 있다. 물론 부가적인 영상처리 등을 위해서는 OpenCV나 numPy 등의 모듈 정도는 기본적으로 설치되어 있어야 한다.  

단 Jetson Nano나  라즈베리파이 등 aarch64 Linux systems기종에 대해서는 아직 pip insall이 지원되지 않고 다음 안내에 따라 설치해 주어야 한다.

 

 

GitHub - jiuqiant/mediapipe_python_aarch64

Contribute to jiuqiant/mediapipe_python_aarch64 development by creating an account on GitHub.

github.com

 

3. 미디어파이프 기본 가이드 

 

설치 후 미디어파이프의 기능별 사용 안내는 다음 링크에서 확인할 수 있다.  

 

그리고 각자의 컴퓨터에 미디어파이프 모듈을 직접 설치하여 개발하기 전에 구글 Colab환경으로 접속하여 코드를 돌려가며 테스트할 수 있는 환경도 제공된다. 

MediaPipe on Google Colab

 

4. 샘플 python 프로그램 

 

Python에서 Hands 인식기능을 이용하여 손가락 동작을 인식하는 샘플 프로그램인데 몇줄 되지 않는다. 이중에서도 실제 AI 모델을 가동시켜 손모양을 인식하는 작업은  20번째 line의 results = hands.process(image) 하나의 명령으로 실행되는 것이다.   

import cv2
import mediapipe as mp

mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands

cap = cv2.VideoCapture(0)

with mp_hands.Hands(
    max_num_hands=1,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5) as hands:

    while cap.isOpened():
        success, image = cap.read()
        if not success:
            continue
        image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)

        results = hands.process(image)

        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

        if results.multi_hand_landmarks:
            for hand_landmarks in results.multi_hand_landmarks:
                finger1 = int(hand_landmarks.landmark[4].x * 100 )
                finger2 = int(hand_landmarks.landmark[8].x * 100 )
                dist = abs(finger1 - finger2)
                cv2.putText(
                    image, text='f1=%d f2=%d dist=%d ' % (finger1,finger2,dist), org=(10, 30),
                    fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=1,
                    color=255, thickness=3)

                mp_drawing.draw_landmarks(
                    image, hand_landmarks, mp_hands.HAND_CONNECTIONS)

        cv2.imshow('image', image)
        if cv2.waitKey(1) == ord('q'):
            break

cap.release()

 

2~5  Line : mediapipe 모듈을 import하고 약식으로 사용할 명칭을 지정한다. mediapipe.solutions.hands모듈이 손동작인식을 위한 모듈이다. 

7 Line : OpenCV로 웹캠을 읽어 입력데이터 소스로 지정한다. 

 

9~12 Line :  hands 손가락 인식모듈의  작동 option을 지정한다. 

    -max_num_hands=1,   : 인식할 손모양의 갯수, 생략하면 2가 지정된다. 

    -min_detection_confidence=0.5,  : 성공적인 것으로 간주되는 최소 신뢰도 값. 0.0 ~1.0사이로서 기본값은 0.5이다.

    -min_tracking_confidence=0.5 :손 랜드마크가 성공적으로 추적된 것으로 간주되는 최소 신뢰도 값. 0.0 ~1.0 사이로서 기본값은 0.5이다. 이 값을 높이면 시간이 더 소요되지만 좀 더 정확한 작동이 보장된다. 

 

18 Line :  OpenCV 영상은 BGR 형식인데 MediaPipe에서는 RGB 형식을 사용하므로 영상형식을 변환해 준다 

 

20 Line : MediaPipe의 hands 모듈을 이용해서 손동작을 인식한다. 이 한줄로서 손동작 인식 AI모델이 작동되고 결과 값이 result로 저장된다. 

 

22 Line :  MediaPipe용 RGB 형식으로 변환했던 것을 OpenCV 영상저리를위해 다시 BGR형식으로 되돌린다. 

 

24~25 : result값이 정상인 경우에만 후속 작업 처리한다. 

 

26~27 : result로 반환된 landmark 데이터를 사용한다. 

 

인식된 손가락 모양은 다음과 같은 index값으로 가지는 배열로 제공된다.

즉, 업지손가락 끝은 landmark[4]에, 검지 손가락 끝은 landmark[8]에 좌표값이 반환되는데, 좌표값은 image상의 x,y위치값을 0.0~1.0 사이의 값으로 표시한다. 즉 image 좌측 최상단은 x=0.0 y=0.0  우측최하단은 x=1.0, y=1.0이 된다. 따라서int(hand_landmarks.landmark[4].x * 100)은 엄지손가락 끝의 x좌표를 100분율로 표시한 것이 된다. 

 

28 Line : 두 손가락 끝의 x좌표값 차이의 절대값을 구해 두 손가락 끝이 벌어진 정도를 계산한다. 

 

34 ~ 35 Line : MediaPipe에 내장된 유틸리티 기능을 이용해서 구해진 손가락 모양을 서로 연결한 그림을 그려준다.

 

위와 같이 손가락 모양을 인식하고 좌표값을 구해낼 수 있고 이를 이용하여 다양한 기능을 개발할 수 있다. 예를 들어 샘플프로그램에서 처럼 두 손가락 끝이 벌어진 정도값을 구해 스피커 볼륨을 조정하는 기기를 개발할 수 있고 가위바위보 게임을 개발할 수도 있다.  또는 연속되는 손동작 변화를 저장해서 animation용 데이터로 활용할 수 도 있을 것이다. 

+ Recent posts