Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MediaPipeの紹介

 MediaPipeの紹介

MediaPipe というリアルタイム推論のための機械学習プラットフォームを紹介します。

Ryosuke Kamesawa

September 13, 2023
Tweet

More Decks by Ryosuke Kamesawa

Other Decks in Programming

Transcript

  1. 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/
  2. 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
  3. 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))
  4. 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 パイプライン
  5. 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()
  6. 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
  7. 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
  8. Mobility Technologies Co., Ltd. 構成 Framework / C++ Calculator /

    C++ Android Java/C++ TFLite Preprocess Postprocess OpenGL iOS Swift/ObjC Python JavaScript wasm C++ API Framework
  9. Mobility Technologies Co., Ltd. - Calculator Graph - 実行するグラフを保持する。入力を与えたり、出力を取得したりできる -

    Calculator - グラフのノード、実際の処理を行う - Packet - ノード間を流れるデータの実体+タイムスタンプ - Input / Output Stream - ノード間を繋ぐキュー - Stream上を流れるPacketのタイムスタンプは単調増加 - Scheduler Queue - Calculatorの実行を管理する。CalculatorGraphが少なくとも一つ持つ - デフォルトでスレッドプールで実行される - Input Stream Handler - Calculatorを実行する条件 (Input Policy) を保持する 概念(登場人物)
  10. 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
  11. Mobility Technologies Co., Ltd. - mediapipeではタイムスタンプを明示的に扱う(Packet生成時に指定する) - タイムスタンプに起因する再現性の問題がなくなる (特に複数入力がある場合) -

    実行のタイミングはInput Policyで制御 - Input policyはパイプライン定義で設定可能 - デフォルトのInput policy - 同じタイムスタンプの入力Packetは同時に処理される (実際の到着時刻には無関係) - 全てのPacketは処理される →実行時に複数入力の一部しか与えられない場合がある その他のInput policy - 全ての入力が揃った時のみ実行 - タイムスタンプと関係なく到着したらすぐに実行 Input Policy
  12. Mobility Technologies Co., Ltd. - Solutions - 既に用意されているパイプラインで簡単に使える - https://google.github.io/mediapipe/solutions/solutions.html

    - パイプラインのカスタマイズ - Calculatorを組み合わせることで様々な処理ができる - Calculatorの追加 - mediapipeに実装を追加しビルドする必要があって難易度は上がる まとめ