Raspberry Pi および iOS 向け MediaPipe

8月 18, 2023
Paul Ruiz Senior Developer Relations Engineer

Google は 5 月に MediaPipe Solutions をリリースしました。これは、オンデバイスの一般的な機械学習タスクを処理するためのノーコードおよびローコード ソリューションのツールセットで、Android、ウェブ、Python で使用できます。このたび、iOS SDK の初期バージョンと、Raspberry Pi をサポートする Python SDK のアップデートが利用可能になりましたのでお知らせいたします。これには、音声分類、顔のランドマーク検出、さまざまな自然言語処理といったタスクのサポートが含まれます。新しいプラットフォームでこうしたツールを使用する方法を見ていきましょう。

Raspberry Pi のオブジェクト検出

カメラ付きの Raspberry Pi ハードウェアをセットアップする以外に、MediaPipe の依存関係をインストールすることから始めることもできます。OpenCV と NumPy がまだインストールされていない場合は、それらも併せてインストールします。

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())

これらの結果と、検出した境界ボックスを描画すると、画面は次のようになります。

この Raspberry Pi の使用例についてさらに詳しくは、GitHub をご覧ください。また、こちらの公式ドキュメントもご活用ください。

iOS でのテキスト分類

ここでは直接的な例としてテキスト分類を取り上げますが、核となるアイデアは、MediaPipe が利用可能な他の iOS タスクにも応用できます。Raspberry Pi と同様に、新しい MediaPipe Tasks オブジェクト(この場合は TextClassifier)を作成することから始めます。

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

TextClassifier を取得したので、あとはこのオブジェクトに String を渡して TextClassifierResult を取得するだけです。

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 では、詳細なドキュメントもご覧いただけます。

スタートガイド

詳細については、MediaPipe を使った簡単なオンデバイス ML機械学習と MediaPipe でウェブアプリをパワーアップ機械学習の新機能についての I/O 2023 セッションをご覧ください。また、developers.google.com/mediapipe の公式ドキュメントもご覧ください。

皆さんが作るエキサイティングな作品を楽しみにしています。ぜひ @googledevs と所属するデベロッパー コミュニティで共有してください!