Mobility Technologies Co., Ltd.
MediaPipe の紹介
2022/10/06 AI技術共有会
Ryosuke Kamesawa
Mobility Technologies Co., Ltd.
MediaPipeとは
入門
Mobility Technologies Co., Ltd.
MediaPipeとは
- ML solutions
- cross-platform
- customizable
- for live and streaming
- Demo: https://viz.mediapipe.dev/demo/face_detection
https://google.github.io/mediapipe/
Mobility Technologies Co., Ltd.
https://google.github.io/mediapipe/solutions/solutions
Solutions
Mobility Technologies Co., Ltd.
- Android
- AAR / native build
- iOS
- native build
- デスクトップ(Linux/MacOS)
- Python (pip)
- C++ (native build)
- ブラウザ(Chrome/Safari)
- JavaScript(NPM, Solutionごと)
- Coral dev board(EdgeTPU, 組み込みLinux)
プラットフォーム対応
https://google.github.io/mediapipe/getting_started/building_examples.html
Mobility Technologies Co., Ltd.
最初から用意されているパイプライン(solution)を実行する場合
使い方: Ready-to-use solutions (Python)
import cv2
import mediapipe as mp
mp_face_detection = mp.solutions.face_detection
with mp_face_detection.FaceDetection(
model_selection=1, min_detection_confidence=0.5) as face_detection:
image = cv2.imread( "image.png")
# Convert the BGR image to RGB
# and process it with MediaPipe Face Detection.
results = face_detection.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
Mobility Technologies Co., Ltd.
パイプラインのカスタマイズ
拡張
Mobility Technologies Co., Ltd.
- パイプラインをグラフとして定義
- ノードはCalculatorと呼ばれ実際の処理を行う
- ノード間にストリーミングデータが流れる
- Protocol buffer (text format) で記述
- Calculatorは動的にスケジューリングされ、スレッドプール上で実行される
- Calculatorの実装はC++
- 組み込みのCalculator
- 前処理(画像フォーマットの変換、FPSの制御)
- 推論(TFLite, Tensorflow)
- 後処理(NMS, 画像へ結果のオーバーレイ)
- and more https://github.com/google/mediapipe/tree/master/mediapipe/calculators
パイプライン
Mobility Technologies Co., Ltd.
Python: CalculatorGraph API
import mediapipe as mp
# Define pipeline graph
config_text = """
input_stream: 'in_stream'
output_stream: 'out_stream'
node {
calculator: 'PassThroughCalculator'
input_stream: 'in_stream'
output_stream: 'out_stream'
}
"""
# Create CalculatorGraph, set callback, and start execution
graph = mp.CalculatorGraph(graph_config=config_text)
output_packets = []
graph.observe_output_stream(
'out_stream',
lambda _, packet: output_packets.append(
mp.packet_getter.get_str(packet)))
graph.start_run()
# Feed string
packet1 = mp.packet_creator.create_string(
'abc').at(0))
graph.add_packet_to_input_stream(
'in_stream', packet1)
# Feed image
rgb_img = cv2.cvtColor(cv2.imread(
'image.png'),
cv2.COLOR_BGR2RGB)
packet2 = mp.packet_creator.create_image_frame(
image_format=mp.ImageFormat.SRGB, data=rgb_img).at(1))
graph.add_packet_to_input_stream(
'in_stream', packet2)
# Destruct CalculatorGraph
graph.close()
Mobility Technologies Co., Ltd.
例: https://viz.mediapipe.dev/demo/face_detection
Protobuf: https://github.com/google/mediapipe/blob/master/mediapipe/framework/calculator.proto
グラフ定義
Mobility Technologies Co., Ltd.
拡張 Calculatorの追加
Mobility Technologies Co., Ltd.
- 実装がC++
- Pythonを含むスクリプト言語は使えない
- クロスプラットフォームを謳っているため?
- mediapipe自体のビルドから行う必要がある
- Github: https://github.com/google/mediapipe
- Example
- https://google.github.io/mediapipe/framework_concepts/calculators.html
- 既存のCalculatorも豊富なので自分で実装することは稀
- 想定された使い方の場合
Calculator
Mobility Technologies Co., Ltd.
CalculatorBaseから次の4つのメソッドをoverride
- GetContract(CalculatorContract* cc)
- 入出力の型の制約
- Open(CalculatorContext*)
- 初期化
- Process(CalculatorContext* cc)
- 実際の処理を記述
- 入力: cc->Inputs().Index(n).Get<T>()
- 出力: cc->Outputs().Index(n).Add(packet)
- Close(CalculatorContext* cc)
- 終了処理
Calculatorを実装する
https://google.github.io/mediapipe/framework_concepts/calculators.html
Mobility Technologies Co., Ltd.
中身どうなってる?
仕組み
Mobility Technologies Co., Ltd.
構成
Framework / C++
Calculator / C++
Android
Java/C++
TFLite Preprocess Postprocess OpenGL
iOS
Swift/ObjC
Python
JavaScript
wasm
C++
API
Framework
Mobility Technologies Co., Ltd.
- Calculator Graph
- 実行するグラフを保持する。入力を与えたり、出力を取得したりできる
- Calculator
- グラフのノード、実際の処理を行う
- Packet
- ノード間を流れるデータの実体+タイムスタンプ
- Input / Output Stream
- ノード間を繋ぐキュー
- Stream上を流れるPacketのタイムスタンプは単調増加
- Scheduler Queue
- Calculatorの実行を管理する。CalculatorGraphが少なくとも一つ持つ
- デフォルトでスレッドプールで実行される
- Input Stream Handler
- Calculatorを実行する条件 (Input Policy) を保持する
概念(登場人物)
Mobility Technologies Co., Ltd.
Calculator Graph
Calc. Node / Context
Calc. Node / Context
概観図
Scheduler Queue
Scheduler Queue
Packet
Calc. Node
Calculator
Output Stream Handler
Input Stream Handler
Calc. Context
Inputs
Outputs
Mobility Technologies Co., Ltd.
- mediapipeではタイムスタンプを明示的に扱う(Packet生成時に指定する)
- タイムスタンプに起因する再現性の問題がなくなる
(特に複数入力がある場合)
- 実行のタイミングはInput Policyで制御
- Input policyはパイプライン定義で設定可能
- デフォルトのInput policy
- 同じタイムスタンプの入力Packetは同時に処理される
(実際の到着時刻には無関係)
- 全てのPacketは処理される
→実行時に複数入力の一部しか与えられない場合がある
その他のInput policy
- 全ての入力が揃った時のみ実行
- タイムスタンプと関係なく到着したらすぐに実行
Input Policy
Mobility Technologies Co., Ltd.
- Solutions
- 既に用意されているパイプラインで簡単に使える
- https://google.github.io/mediapipe/solutions/solutions.html
- パイプラインのカスタマイズ
- Calculatorを組み合わせることで様々な処理ができる
- Calculatorの追加
- mediapipeに実装を追加しビルドする必要があって難易度は上がる
まとめ

MediaPipeの紹介

  • 1.
    Mobility Technologies Co.,Ltd. MediaPipe の紹介 2022/10/06 AI技術共有会 Ryosuke Kamesawa
  • 2.
    Mobility Technologies Co.,Ltd. MediaPipeとは 入門
  • 3.
    Mobility Technologies Co.,Ltd. MediaPipeとは - ML solutions - cross-platform - customizable - for live and streaming - Demo: https://viz.mediapipe.dev/demo/face_detection https://google.github.io/mediapipe/
  • 4.
    Mobility Technologies Co.,Ltd. https://google.github.io/mediapipe/solutions/solutions Solutions
  • 5.
    Mobility Technologies Co.,Ltd. - Android - AAR / native build - iOS - native build - デスクトップ(Linux/MacOS) - Python (pip) - C++ (native build) - ブラウザ(Chrome/Safari) - JavaScript(NPM, Solutionごと) - Coral dev board(EdgeTPU, 組み込みLinux) プラットフォーム対応 https://google.github.io/mediapipe/getting_started/building_examples.html
  • 6.
    Mobility Technologies Co.,Ltd. 最初から用意されているパイプライン(solution)を実行する場合 使い方: Ready-to-use solutions (Python) import cv2 import mediapipe as mp mp_face_detection = mp.solutions.face_detection with mp_face_detection.FaceDetection( model_selection=1, min_detection_confidence=0.5) as face_detection: image = cv2.imread( "image.png") # Convert the BGR image to RGB # and process it with MediaPipe Face Detection. results = face_detection.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
  • 7.
    Mobility Technologies Co.,Ltd. パイプラインのカスタマイズ 拡張
  • 8.
    Mobility Technologies Co.,Ltd. - パイプラインをグラフとして定義 - ノードはCalculatorと呼ばれ実際の処理を行う - ノード間にストリーミングデータが流れる - Protocol buffer (text format) で記述 - Calculatorは動的にスケジューリングされ、スレッドプール上で実行される - Calculatorの実装はC++ - 組み込みのCalculator - 前処理(画像フォーマットの変換、FPSの制御) - 推論(TFLite, Tensorflow) - 後処理(NMS, 画像へ結果のオーバーレイ) - and more https://github.com/google/mediapipe/tree/master/mediapipe/calculators パイプライン
  • 9.
    Mobility Technologies Co.,Ltd. Python: CalculatorGraph API import mediapipe as mp # Define pipeline graph config_text = """ input_stream: 'in_stream' output_stream: 'out_stream' node { calculator: 'PassThroughCalculator' input_stream: 'in_stream' output_stream: 'out_stream' } """ # Create CalculatorGraph, set callback, and start execution graph = mp.CalculatorGraph(graph_config=config_text) output_packets = [] graph.observe_output_stream( 'out_stream', lambda _, packet: output_packets.append( mp.packet_getter.get_str(packet))) graph.start_run() # Feed string packet1 = mp.packet_creator.create_string( 'abc').at(0)) graph.add_packet_to_input_stream( 'in_stream', packet1) # Feed image rgb_img = cv2.cvtColor(cv2.imread( 'image.png'), cv2.COLOR_BGR2RGB) packet2 = mp.packet_creator.create_image_frame( image_format=mp.ImageFormat.SRGB, data=rgb_img).at(1)) graph.add_packet_to_input_stream( 'in_stream', packet2) # Destruct CalculatorGraph graph.close()
  • 10.
    Mobility Technologies Co.,Ltd. 例: https://viz.mediapipe.dev/demo/face_detection Protobuf: https://github.com/google/mediapipe/blob/master/mediapipe/framework/calculator.proto グラフ定義
  • 11.
    Mobility Technologies Co.,Ltd. 拡張 Calculatorの追加
  • 12.
    Mobility Technologies Co.,Ltd. - 実装がC++ - Pythonを含むスクリプト言語は使えない - クロスプラットフォームを謳っているため? - mediapipe自体のビルドから行う必要がある - Github: https://github.com/google/mediapipe - Example - https://google.github.io/mediapipe/framework_concepts/calculators.html - 既存のCalculatorも豊富なので自分で実装することは稀 - 想定された使い方の場合 Calculator
  • 13.
    Mobility Technologies Co.,Ltd. CalculatorBaseから次の4つのメソッドをoverride - GetContract(CalculatorContract* cc) - 入出力の型の制約 - Open(CalculatorContext*) - 初期化 - Process(CalculatorContext* cc) - 実際の処理を記述 - 入力: cc->Inputs().Index(n).Get<T>() - 出力: cc->Outputs().Index(n).Add(packet) - Close(CalculatorContext* cc) - 終了処理 Calculatorを実装する https://google.github.io/mediapipe/framework_concepts/calculators.html
  • 14.
    Mobility Technologies Co.,Ltd. 中身どうなってる? 仕組み
  • 15.
    Mobility Technologies Co.,Ltd. 構成 Framework / C++ Calculator / C++ Android Java/C++ TFLite Preprocess Postprocess OpenGL iOS Swift/ObjC Python JavaScript wasm C++ API Framework
  • 16.
    Mobility Technologies Co.,Ltd. - Calculator Graph - 実行するグラフを保持する。入力を与えたり、出力を取得したりできる - Calculator - グラフのノード、実際の処理を行う - Packet - ノード間を流れるデータの実体+タイムスタンプ - Input / Output Stream - ノード間を繋ぐキュー - Stream上を流れるPacketのタイムスタンプは単調増加 - Scheduler Queue - Calculatorの実行を管理する。CalculatorGraphが少なくとも一つ持つ - デフォルトでスレッドプールで実行される - Input Stream Handler - Calculatorを実行する条件 (Input Policy) を保持する 概念(登場人物)
  • 17.
    Mobility Technologies Co.,Ltd. Calculator Graph Calc. Node / Context Calc. Node / Context 概観図 Scheduler Queue Scheduler Queue Packet Calc. Node Calculator Output Stream Handler Input Stream Handler Calc. Context Inputs Outputs
  • 18.
    Mobility Technologies Co.,Ltd. - mediapipeではタイムスタンプを明示的に扱う(Packet生成時に指定する) - タイムスタンプに起因する再現性の問題がなくなる (特に複数入力がある場合) - 実行のタイミングはInput Policyで制御 - Input policyはパイプライン定義で設定可能 - デフォルトのInput policy - 同じタイムスタンプの入力Packetは同時に処理される (実際の到着時刻には無関係) - 全てのPacketは処理される →実行時に複数入力の一部しか与えられない場合がある その他のInput policy - 全ての入力が揃った時のみ実行 - タイムスタンプと関係なく到着したらすぐに実行 Input Policy
  • 19.
    Mobility Technologies Co.,Ltd. - Solutions - 既に用意されているパイプラインで簡単に使える - https://google.github.io/mediapipe/solutions/solutions.html - パイプラインのカスタマイズ - Calculatorを組み合わせることで様々な処理ができる - Calculatorの追加 - mediapipeに実装を追加しビルドする必要があって難易度は上がる まとめ