Slide 1

Slide 1 text

Mobility Technologies Co., Ltd. MediaPipe の紹介 2022/10/06 AI技術共有会 Ryosuke Kamesawa

Slide 2

Slide 2 text

Mobility Technologies Co., Ltd. MediaPipeとは 入門

Slide 3

Slide 3 text

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/

Slide 4

Slide 4 text

Mobility Technologies Co., Ltd. https://google.github.io/mediapipe/solutions/solutions Solutions

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Mobility Technologies Co., Ltd. パイプラインのカスタマイズ 拡張

Slide 8

Slide 8 text

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 パイプライン

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Mobility Technologies Co., Ltd. 例: https://viz.mediapipe.dev/demo/face_detection Protobuf: https://github.com/google/mediapipe/blob/master/mediapipe/framework/calculator.proto グラフ定義

Slide 11

Slide 11 text

Mobility Technologies Co., Ltd. 拡張 Calculatorの追加

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Mobility Technologies Co., Ltd. CalculatorBaseから次の4つのメソッドをoverride - GetContract(CalculatorContract* cc) - 入出力の型の制約 - Open(CalculatorContext*) - 初期化 - Process(CalculatorContext* cc) - 実際の処理を記述 - 入力: cc->Inputs().Index(n).Get() - 出力: cc->Outputs().Index(n).Add(packet) - Close(CalculatorContext* cc) - 終了処理 Calculatorを実装する https://google.github.io/mediapipe/framework_concepts/calculators.html

Slide 14

Slide 14 text

Mobility Technologies Co., Ltd. 中身どうなってる? 仕組み

Slide 15

Slide 15 text

Mobility Technologies Co., Ltd. 構成 Framework / C++ Calculator / C++ Android Java/C++ TFLite Preprocess Postprocess OpenGL iOS Swift/ObjC Python JavaScript wasm C++ API Framework

Slide 16

Slide 16 text

Mobility Technologies Co., Ltd. - Calculator Graph - 実行するグラフを保持する。入力を与えたり、出力を取得したりできる - Calculator - グラフのノード、実際の処理を行う - Packet - ノード間を流れるデータの実体+タイムスタンプ - Input / Output Stream - ノード間を繋ぐキュー - Stream上を流れるPacketのタイムスタンプは単調増加 - Scheduler Queue - Calculatorの実行を管理する。CalculatorGraphが少なくとも一つ持つ - デフォルトでスレッドプールで実行される - Input Stream Handler - Calculatorを実行する条件 (Input Policy) を保持する 概念(登場人物)

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

Mobility Technologies Co., Ltd. - mediapipeではタイムスタンプを明示的に扱う(Packet生成時に指定する) - タイムスタンプに起因する再現性の問題がなくなる (特に複数入力がある場合) - 実行のタイミングはInput Policyで制御 - Input policyはパイプライン定義で設定可能 - デフォルトのInput policy - 同じタイムスタンプの入力Packetは同時に処理される (実際の到着時刻には無関係) - 全てのPacketは処理される →実行時に複数入力の一部しか与えられない場合がある その他のInput policy - 全ての入力が揃った時のみ実行 - タイムスタンプと関係なく到着したらすぐに実行 Input Policy

Slide 19

Slide 19 text

Mobility Technologies Co., Ltd. - Solutions - 既に用意されているパイプラインで簡単に使える - https://google.github.io/mediapipe/solutions/solutions.html - パイプラインのカスタマイズ - Calculatorを組み合わせることで様々な処理ができる - Calculatorの追加 - mediapipeに実装を追加しビルドする必要があって難易度は上がる まとめ