MediaPipeUnityPlugin icon indicating copy to clipboard operation
MediaPipeUnityPlugin copied to clipboard

Unity plugin to run MediaPipe

MediaPipe Unity Plugin

This is a Unity (2021.3.3f1) Native Plugin to use MediaPipe (0.8.10).

The goal of this project is to port the MediaPipe API (C++) one by one to C# so that it can be called from Unity.
This approach may sacrifice performance when you need to call multiple APIs in a loop, but it gives you the flexibility to use MediaPipe instead.

With this plugin, you can

  • Write MediaPipe code in C#.
  • Run MediaPipe's official solution on Unity.
  • Run your custom Calculator and CalculatorGraph on Unity.
    • :warning: Depending on the type of input/output, you may need to write C++ code.

:smile_cat: Hello World!

Here is a Hello World! example.
Compare it with the official code!

using Mediapipe;
using UnityEngine;

public sealed class HelloWorld : MonoBehaviour
{
    private const string _ConfigText = @"
input_stream: ""in""
output_stream: ""out""
node {
  calculator: ""PassThroughCalculator""
  input_stream: ""in""
  output_stream: ""out1""
}
node {
  calculator: ""PassThroughCalculator""
  input_stream: ""out1""
  output_stream: ""out""
}
";

    private void Start()
    {
        var graph = new CalculatorGraph(_ConfigText);
        var poller = graph.AddOutputStreamPoller<string>("out").Value();
        graph.StartRun().AssertOk();

        for (var i = 0; i < 10; i++)
        {
            graph.AddPacketToInputStream("in", new StringPacket("Hello World!", new Timestamp(i))).AssertOk();
        }

        graph.CloseInputStream("in").AssertOk();
        var packet = new StringPacket();

        while (poller.Next(packet))
        {
            Debug.Log(packet.Get());
        }
        graph.WaitUntilDone().AssertOk();
    }
}

For more detailed usage, see the API Overview page or the tutorial on the Getting Started page.

:hammer_and_wrench: Installation

This repository does not contain required libraries (e.g. libmediapipe_c.so, Google.Protobuf.dll, etc).
You can download an all-in-one package from the release page, but if you want to customize the package or minify the package size, you need to build them by yourself.\

For a step-by-step guide, please refer to the Installation Guide in Wiki.
You can also take advantage of the Package Workflow on Github Actions.

:warning: libraries that can be built differ depending on your environment.

Supported Platforms

:warning: GPU mode is not supported on macOS and Windows.

Editor Linux (x86_64) macOS (x86_64) macOS (ARM64) Windows (x86_64) Android iOS WebGL
Linux (AMD64) [^1] :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Intel Mac :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
M1 Mac [^2] :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Windows 10/11 (AMD64) [^3] :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:

[^1]: Tested on Arch Linux. [^2]: Experimental, because MediaPipe does not support M1 Mac. [^3]: Running MediaPipe on Windows is experimental.

:plate_with_cutlery: Try the sample app

Example Solutions

Here is a list of solutions that you can try in the sample app.

:bell: The graphs you can run are not limited to the ones in this list.

Android iOS Linux (GPU) Linux (CPU) macOS (CPU) Windows (CPU) WebGL
Face Detection :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Face Mesh :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Iris :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Hands :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Pose :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Holistic :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Selfie Segmentation :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Hair Segmentation :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Object Detection :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Box Tracking :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Instant Motion Tracking :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
Objectron :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark: :heavy_check_mark:
KNIFT

UnityEditor

Select Mediapipe/Samples/Scenes/Start Scene and play.

Desktop

If you've built native libraries for CPU (i.e. --desktop cpu), select CPU for inference mode from the Inspector Window. preferable-inference-mode

Android, iOS

Make sure that you select GPU for inference mode before building the app, because CPU inference mode is not supported currently.

:book: Wiki

https://github.com/homuler/MediaPipeUnityPlugin/wiki

:scroll: LICENSE

MIT

Note that some files are distributed under other licenses.

  • MediaPipe (Apache Licence 2.0)
  • emscripten (MIT)
    • third_party/mediapipe_emscripten_patch.diff contains code copied from emscripten
  • FontAwesome (LICENSE)
    • Sample scenes use Font Awesome fonts

See also Third Party Notices.md.