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

MediaPipeの紹介

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 MediaPipeの紹介

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

Avatar for Ryosuke Kamesawa

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に実装を追加しビルドする必要があって難易度は上がる まとめ