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이 지원되지 않고 다음 안내에 따라 설치해 주어야 한다.
3. 미디어파이프 기본 가이드
설치 후 미디어파이프의 기능별 사용 안내는 다음 링크에서 확인할 수 있다.
- MediaPipe Face Detection
- MediaPipe Face Mesh
- MediaPipe Hands
- MediaPipe Holistic
- MediaPipe Objectron
- MediaPipe Pose
- MediaPipe Selfie Segmentation
그리고 각자의 컴퓨터에 미디어파이프 모듈을 직접 설치하여 개발하기 전에 구글 Colab환경으로 접속하여 코드를 돌려가며 테스트할 수 있는 환경도 제공된다.
MediaPipe on Google Colab
- MediaPipe Face Detection Colab
- MediaPipe Face Mesh Colab
- MediaPipe Hands Colab
- MediaPipe Holistic Colab
- MediaPipe Objectron Colab
- MediaPipe Pose Colab
- MediaPipe Pose Classification Colab (Basic)
- MediaPipe Pose Classification Colab (Extended)
- MediaPipe Selfie Segmentation 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용 데이터로 활용할 수 도 있을 것이다.
'메이킹프로젝트 > AI 툴과 프로젝트' 카테고리의 다른 글
미디어파이프(MediaPipe)로 AI Web페이지 개발하기 (1) | 2021.08.21 |
---|---|
구글 AI 프레임워크 미디어파이프(MediaPipe) 소개 (1) | 2021.08.02 |
Teachable Machine 재미있는 개발 프로젝트들 (0) | 2021.03.12 |
Teachable Machine 에서 제작된 AI학습모델로 웹서비스 만들기 (0) | 2021.03.10 |
Teachable Machine으로 AI머신러닝 실습 (0) | 2021.03.01 |