Raspberry Pi 및 iOS용 MediaPipe

8월 18, 2023
Paul Ruiz Senior Developer Relations Engineer

지난 5월에는 Android, 웹 및 Python을 위한 일반적인 온디바이스 머신 러닝 작업에 대한 노코드 및 로우코드 솔루션의 도구 세트인 MediaPipe Solutions를 출시했습니다. 오늘 우리는 iOS SDK의 초기 버전과 Raspberry Pi를 지원하는 Python SDK에 대한 업데이트를 사용할 수 있음을 발표하게 되어 기쁘게 생각합니다. 여기에는 오디오 분류, 얼굴 랜드마크 감지 및 다양한 자연어 처리 작업에 대한 지원이 포함됩니다. 이제 이러한 도구를 새로운 플랫폼에 어떻게 사용할 수 있는지 살펴보겠습니다.

Raspberry Pi용 객체 감지

카메라로 Raspberry Pi 하드웨어를 설정하는 것 외에도, 아직 설치하지 않은 경우 OpenCV 및 NumPy와 함께 MediaPipe 종속성을 설치하여 시작할 수 있습니다.

python -m pip install mediapipe

여기에서 새 Python 파일을 만들고 가져온 항목을 맨 위에 추가할 수 있습니다.

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
import cv2
import numpy as np

또한 Raspberry Pi에 로컬로 저장된 객체 감지 모델이 있는지 확인해야 합니다. 편의를 위해 다음 명령으로 검색할 수 있는 기본 모델인 EfficientDet-Lite0을 제공했습니다.

wget -q -O efficientdet.tflite -q https://storage.googleapis.com/mediapipe-models/object_detector/efficientdet_lite0/int8/1/efficientdet_lite0.tflite

모델을 다운로드하면, 받고자 하는 최대의 결과 또는 결과를 얻기 전에 초과해야 하는 신뢰 임계값과 같은 일부 사용자 정의를 포함하여 새 ObjectDetector를 만들 수 있습니다.

# 객체 감지 모델 초기화
base_options = python.BaseOptions(model_asset_path=model)
options = vision.ObjectDetectorOptions(
                                   base_options=base_options,
                                   running_mode=vision.RunningMode.LIVE_STREAM,
                                   max_results=max_results,                                                       score_threshold=score_threshold, 
                                   result_callback=save_result)
detector = vision.ObjectDetector.create_from_options(options)

ObjectDetector를 만든 후 연속 프레임을 읽으려면 Raspberry Pi 카메라를 열어야 합니다. 여기에서 생략되는 몇 가지 전처리 단계가 있지만 GitHub의 샘플에서 확인할 수 있습니다.

해당 루프 내에서 처리된 카메라 이미지를 새 MediaPipe.Image로 변환한 다음, 연결된 리스너에서 수신된 결과를 표시하기 전에 해당 새 MediaPipe.Image에 대한 감지를 실행할 수 있습니다.

mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=rgb_image)
detector.detect_async(mp_image, time.time_ns())

해당 결과와 감지된 경계 상자를 시각화하면 다음과 같은 내용을 볼 수 있습니다.

GitHub에서 위에 표시된 전체 Raspberry Pi 예제를 확인하거나 여기에서 공식 문서를 확인할 수 있습니다.

iOS의 텍스트 분류

텍스트 분류는 더 직접적인 예시 중 하나이지만, 핵심 개념은 여전히 사용 가능한 나머지 iOS 작업에도 적용됩니다. Raspberry Pi와 마찬가지로 새 MediaPipe Tasks 객체를 만드는 것으로 시작하며, 여기에서는 TextClassifier입니다.

var textClassifier: TextClassifier?
 
textClassifier = TextClassifier(modelPath: model.modelPath)

이제 TextClassifier가 있으므로 TextClassifierResult를 얻으려면 String을 전달하기만 하면 됩니다.

func classify(text: String) -> TextClassifierResult? {
    guard let textClassifier = textClassifier else {
        return nil
    }
 
    return try? textClassifier.classify(text: text)
}

결과를 표시하기 전에 ViewController DispatchQueue와 같이 앱의 다른 곳에서 이 작업을 수행할 수 있습니다.

let result = self?.textClassifier.classify(text: inputText)
let categories = result?.classificationResult.classifications.first?.categories?? []

GitHub에서 이 프로젝트의 나머지 코드를 확인할 수 있으며 developers.google.com/mediapipe에서 전체 문서를 확인할 수 있습니다.

시작하기

자세히 알아보려면 I/O 2023 세션 Easy on-device ML with MediaPipe(MediaPipe를 사용하는 간편한 온디바이스 ML), Supercharge your web app with machine learning and MediaPipe(머신러닝과 MediaPipe를 사용한 웹 앱 강화), What's new in machine learning(머신러닝의 새로운 기능)을 시청하고 developers.google.com/mediapipe에서 공식 문서를 확인해 보세요.

개발자 여러분이 어떤 흥미로운 결과물을 만들지 정말 기대됩니다. 여러분의 개발품들을 @googledevs 및 개발자 커뮤니티와 꼭 공유해 주세요!