--- layout: default title: Installation parent: Getting Started nav_order: 1 --- # Installation {: .no_toc } 1. TOC {:toc} --- Note: To interoperate with OpenCV, OpenCV 3.x and above are preferred. OpenCV 2.x currently works but interoperability support may be deprecated in the future. Note: If you plan to use TensorFlow calculators and example apps, there is a known issue with gcc and g++ version 6.3 and 7.3. Please use other versions. Note: To make Mediapipe work with TensorFlow, please set Python 3.7 as the default Python version and install the Python "six" library by running `pip3 install --user six`. Note: To build and run Android example apps, see these [instructions](./building_examples.md#android). To build and run iOS example apps, see these [instructions](./building_examples.md#ios). ## Installing on Debian and Ubuntu 1. Checkout MediaPipe repository. ```bash $ git clone https://github.com/google/mediapipe.git # Change directory into MediaPipe root directory $ cd mediapipe ``` 2. Install Bazel. Follow the official [Bazel documentation](https://docs.bazel.build/versions/master/install-ubuntu.html) to install Bazel 2.0 or higher. For Nvidia Jetson and Raspberry Pi devices with ARM Ubuntu, Bazel needs to be built from source. ```bash # For Bazel 3.0.0 wget https://github.com/bazelbuild/bazel/releases/download/3.0.0/bazel-3.0.0-dist.zip sudo apt-get install build-essential openjdk-8-jdk python zip unzip unzip bazel-3.0.0-dist.zip env EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" bash ./compile.sh sudo cp output/bazel /usr/local/bin/ ``` 3. Install OpenCV and FFmpeg. Option 1. Use package manager tool to install the pre-compiled OpenCV libraries. FFmpeg will be installed via libopencv-video-dev. Note: Debian 9 and Ubuntu 16.04 provide OpenCV 2.4.9. You may want to take option 2 or 3 to install OpenCV 3 or above. ```bash $ sudo apt-get install libopencv-core-dev libopencv-highgui-dev \ libopencv-calib3d-dev libopencv-features2d-dev \ libopencv-imgproc-dev libopencv-video-dev ``` [`opencv_linux.BUILD`] is configured for x86_64 by default. For Nvidia Jetson and Raspberry Pi devices with ARM Ubuntu, the lib paths need to be modified. ```bash sed -i "s/x86_64-linux-gnu/aarch64-linux-gnu/g" third_party/opencv_linux.BUILD ``` Option 2. Run [`setup_opencv.sh`] to automatically build OpenCV from source and modify MediaPipe's OpenCV config. Option 3. Follow OpenCV's [documentation](https://docs.opencv.org/3.4.6/d7/d9f/tutorial_linux_install.html) to manually build OpenCV from source code. Note: You may need to modify [`WORKSPACE`] and [`opencv_linux.BUILD`] to point MediaPipe to your own OpenCV libraries, e.g., if OpenCV 4 is installed in "/usr/local/", you need to update the "linux_opencv" new_local_repository rule in [`WORKSPACE`] and "opencv" cc_library rule in [`opencv_linux.BUILD`] like the following: ```bash new_local_repository( name = "linux_opencv", build_file = "@//third_party:opencv_linux.BUILD", path = "/usr/local", ) cc_library( name = "opencv", srcs = glob( [ "lib/libopencv_core.so", "lib/libopencv_highgui.so", "lib/libopencv_imgcodecs.so", "lib/libopencv_imgproc.so", "lib/libopencv_video.so", "lib/libopencv_videoio.so", ], ), hdrs = glob(["include/opencv4/**/*.h*"]), includes = ["include/opencv4/"], linkstatic = 1, visibility = ["//visibility:public"], ) ``` 4. For running desktop examples on Linux only (not on OS X) with GPU acceleration. ```bash # Requires a GPU with EGL driver support. # Can use mesa GPU libraries for desktop, (or Nvidia/AMD equivalent). sudo apt-get install mesa-common-dev libegl1-mesa-dev libgles2-mesa-dev # To compile with GPU support, replace --define MEDIAPIPE_DISABLE_GPU=1 # with --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 # when building GPU examples. ``` 5. Run the [Hello World desktop example](./hello_world_desktop.md). ```bash $ export GLOG_logtostderr=1 # if you are running on Linux desktop with CPU only $ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \ mediapipe/examples/desktop/hello_world:hello_world # If you are running on Linux desktop with GPU support enabled (via mesa drivers) $ bazel run --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 \ mediapipe/examples/desktop/hello_world:hello_world # Should print: # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! ``` ## Installing on CentOS **Disclaimer**: Running MediaPipe on CentOS is experimental. 1. Checkout MediaPipe repository. ```bash $ git clone https://github.com/google/mediapipe.git # Change directory into MediaPipe root directory $ cd mediapipe ``` 2. Install Bazel. Follow the official [Bazel documentation](https://docs.bazel.build/versions/master/install-redhat.html) to install Bazel 2.0 or higher. 3. Install OpenCV. Option 1. Use package manager tool to install the pre-compiled version. Note: yum installs OpenCV 2.4.5, which may have an opencv/gstreamer [issue](https://github.com/opencv/opencv/issues/4592). ```bash $ sudo yum install opencv-devel ``` Option 2. Build OpenCV from source code. Note: You may need to modify [`WORKSPACE`] and [`opencv_linux.BUILD`] to point MediaPipe to your own OpenCV libraries, e.g., if OpenCV 4 is installed in "/usr/local/", you need to update the "linux_opencv" new_local_repository rule in [`WORKSPACE`] and "opencv" cc_library rule in [`opencv_linux.BUILD`] like the following: ```bash new_local_repository( name = "linux_opencv", build_file = "@//third_party:opencv_linux.BUILD", path = "/usr/local", ) cc_library( name = "opencv", srcs = glob( [ "lib/libopencv_core.so", "lib/libopencv_highgui.so", "lib/libopencv_imgcodecs.so", "lib/libopencv_imgproc.so", "lib/libopencv_video.so", "lib/libopencv_videoio.so", ], ), hdrs = glob(["include/opencv4/**/*.h*"]), includes = ["include/opencv4/"], linkstatic = 1, visibility = ["//visibility:public"], ) ``` 4. Run the [Hello World desktop example](./hello_world_desktop.md). ```bash $ export GLOG_logtostderr=1 # Need bazel flag 'MEDIAPIPE_DISABLE_GPU=1' if you are running on Linux desktop with CPU only $ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \ mediapipe/examples/desktop/hello_world:hello_world # Should print: # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! ``` ## Installing on macOS 1. Prework: * Install [Homebrew](https://brew.sh). * Install [Xcode](https://developer.apple.com/xcode/) and its Command Line Tools by `xcode-select --install`. 2. Checkout MediaPipe repository. ```bash $ git clone https://github.com/google/mediapipe.git $ cd mediapipe ``` 3. Install Bazel. Option 1. Use package manager tool to install Bazel ```bash $ brew install bazel # Run 'bazel version' to check version of bazel ``` Option 2. Follow the official [Bazel documentation](https://docs.bazel.build/versions/master/install-os-x.html#install-with-installer-mac-os-x) to install Bazel 2.0 or higher. 4. Install OpenCV and FFmpeg. Option 1. Use HomeBrew package manager tool to install the pre-compiled OpenCV 3.4.5 libraries. FFmpeg will be installed via OpenCV. ```bash $ brew install opencv@3 # There is a known issue caused by the glog dependency. Uninstall glog. $ brew uninstall --ignore-dependencies glog ``` Option 2. Use MacPorts package manager tool to install the OpenCV libraries. ```bash $ port install opencv ``` Note: when using MacPorts, please edit the [`WORKSPACE`], [`opencv_macos.BUILD`], and [`ffmpeg_macos.BUILD`] files like the following: ```bash new_local_repository( name = "macos_opencv", build_file = "@//third_party:opencv_macos.BUILD", path = "/opt", ) new_local_repository( name = "macos_ffmpeg", build_file = "@//third_party:ffmpeg_macos.BUILD", path = "/opt", ) cc_library( name = "opencv", srcs = glob( [ "local/lib/libopencv_core.dylib", "local/lib/libopencv_highgui.dylib", "local/lib/libopencv_imgcodecs.dylib", "local/lib/libopencv_imgproc.dylib", "local/lib/libopencv_video.dylib", "local/lib/libopencv_videoio.dylib", ], ), hdrs = glob(["local/include/opencv2/**/*.h*"]), includes = ["local/include/"], linkstatic = 1, visibility = ["//visibility:public"], ) cc_library( name = "libffmpeg", srcs = glob( [ "local/lib/libav*.dylib", ], ), hdrs = glob(["local/include/libav*/*.h"]), includes = ["local/include/"], linkopts = [ "-lavcodec", "-lavformat", "-lavutil", ], linkstatic = 1, visibility = ["//visibility:public"], ) ``` 5. Make sure that Python 3 and the Python "six" library are installed. ``` $ brew install python $ sudo ln -s -f /usr/local/bin/python3.7 /usr/local/bin/python $ python --version Python 3.7.4 $ pip3 install --user six ``` 6. Run the [Hello World desktop example](./hello_world_desktop.md). ```bash $ export GLOG_logtostderr=1 # Need bazel flag 'MEDIAPIPE_DISABLE_GPU=1' as desktop GPU is currently not supported $ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \ mediapipe/examples/desktop/hello_world:hello_world # Should print: # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! ``` ## Installing on Windows **Disclaimer**: Running MediaPipe on Windows is experimental. Note: building MediaPipe Android apps is still not possible on native Windows. Please do this in WSL instead and see the WSL setup instruction in the next section. 1. Install [MSYS2](https://www.msys2.org/) and edit the `%PATH%` environment variable. If MSYS2 is installed to `C:\msys64`, add `C:\msys64\usr\bin` to your `%PATH%` environment variable. 2. Install necessary packages. ``` C:\> pacman -S git patch unzip ``` 3. Install Python and allow the executable to edit the `%PATH%` environment variable. Download Python Windows executable from https://www.python.org/downloads/windows/ and install. 4. Install Visual C++ Build Tools 2019 and WinSDK Go to https://visualstudio.microsoft.com/visual-cpp-build-tools, download build tools, and install Microsoft Visual C++ 2019 Redistributable and Microsoft Build Tools 2019. Download the WinSDK from https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk/ and install. 5. Install Bazel and add the location of the Bazel executable to the `%PATH%` environment variable. Follow the official [Bazel documentation](https://docs.bazel.build/versions/master/install-windows.html) to install Bazel 2.0 or higher. 6. Set Bazel variables. ``` # Find the exact paths and version numbers from your local version. C:\> set BAZEL_VS=C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools C:\> set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC C:\> set BAZEL_VC_FULL_VERSION=14.25.28610 C:\> set BAZEL_WINSDK_FULL_VERSION=10.1.18362.1 ``` 7. Checkout MediaPipe repository. ``` C:\Users\Username\mediapipe_repo> git clone https://github.com/google/mediapipe.git # Change directory into MediaPipe root directory C:\Users\Username\mediapipe_repo> cd mediapipe ``` 8. Install OpenCV. Download the Windows executable from https://opencv.org/releases/ and install. We currently use OpenCV 3.4.10. Remember to edit the [`WORKSPACE`] file if OpenCV is not installed at `C:\opencv`. ``` new_local_repository( name = "windows_opencv", build_file = "@//third_party:opencv_windows.BUILD", path = "C:\\\\build", ) ``` 9. Run the [Hello World desktop example](./hello_world_desktop.md). Note: For building MediaPipe on Windows, please add `--action_env PYTHON_BIN_PATH="C:/path/to/python.exe"` to the build command. Alternatively, you can follow [issue 724](https://github.com/google/mediapipe/issues/724) to fix the python configuration manually. ``` C:\Users\Username\mediapipe_repo>bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --action_env PYTHON_BIN_PATH="C:/python_36/python.exe" mediapipe/examples/desktop/hello_world C:\Users\Username\mediapipe_repo>set GLOG_logtostderr=1 C:\Users\Username\mediapipe_repo>bazel-bin\mediapipe\examples\desktop\hello_world\hello_world.exe # should print: # I20200514 20:43:12.277598 1200 hello_world.cc:56] Hello World! # I20200514 20:43:12.278597 1200 hello_world.cc:56] Hello World! # I20200514 20:43:12.279618 1200 hello_world.cc:56] Hello World! # I20200514 20:43:12.279618 1200 hello_world.cc:56] Hello World! # I20200514 20:43:12.279618 1200 hello_world.cc:56] Hello World! # I20200514 20:43:12.279618 1200 hello_world.cc:56] Hello World! # I20200514 20:43:12.279618 1200 hello_world.cc:56] Hello World! # I20200514 20:43:12.279618 1200 hello_world.cc:56] Hello World! # I20200514 20:43:12.279618 1200 hello_world.cc:56] Hello World! # I20200514 20:43:12.280613 1200 hello_world.cc:56] Hello World! ``` ## Installing on Windows Subsystem for Linux (WSL) Note: The pre-built OpenCV packages don't support cameras in WSL. Unless you [compile](https://funvision.blogspot.com/2019/12/opencv-web-camera-and-video-streams-in.html) OpenCV with FFMPEG and GStreamer in WSL, the live demos won't work with any cameras. Alternatively, you use a video file as input. 1. Follow the [instruction](https://docs.microsoft.com/en-us/windows/wsl/install-win10) to install Windows Sysystem for Linux (Ubuntu). 2. Install Windows ADB and start the ADB server in Windows. Note: Windows' and WSL’s adb versions must be the same version, e.g., if WSL has ADB 1.0.39, you need to download the corresponding Windows ADB from [here](https://dl.google.com/android/repository/platform-tools_r26.0.1-windows.zip). 3. Launch WSL. Note: All the following steps will be executed in WSL. The Windows directory of the Linux Subsystem can be found in C:\Users\YourUsername\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_SomeID\LocalState\rootfs\home 4. Install the needed packages. ```bash username@DESKTOP-TMVLBJ1:~$ sudo apt-get update && sudo apt-get install -y build-essential git python zip adb openjdk-8-jdk ``` 5. Install Bazel. ```bash username@DESKTOP-TMVLBJ1:~$ curl -sLO --retry 5 --retry-max-time 10 \ https://storage.googleapis.com/bazel/3.0.0/release/bazel-3.0.0-installer-linux-x86_64.sh && \ sudo mkdir -p /usr/local/bazel/3.0.0 && \ chmod 755 bazel-3.0.0-installer-linux-x86_64.sh && \ sudo ./bazel-3.0.0-installer-linux-x86_64.sh --prefix=/usr/local/bazel/3.0.0 && \ source /usr/local/bazel/3.0.0/lib/bazel/bin/bazel-complete.bash username@DESKTOP-TMVLBJ1:~$ /usr/local/bazel/3.0.0/lib/bazel/bin/bazel version && \ alias bazel='/usr/local/bazel/3.0.0/lib/bazel/bin/bazel' ``` 6. Checkout MediaPipe repository. ```bash username@DESKTOP-TMVLBJ1:~$ git clone https://github.com/google/mediapipe.git username@DESKTOP-TMVLBJ1:~$ cd mediapipe ``` 7. Install OpenCV and FFmpeg. Option 1. Use package manager tool to install the pre-compiled OpenCV libraries. FFmpeg will be installed via libopencv-video-dev. ```bash username@DESKTOP-TMVLBJ1:~/mediapipe$ sudo apt-get install libopencv-core-dev libopencv-highgui-dev \ libopencv-calib3d-dev libopencv-features2d-dev \ libopencv-imgproc-dev libopencv-video-dev ``` Option 2. Run [`setup_opencv.sh`] to automatically build OpenCV from source and modify MediaPipe's OpenCV config. Option 3. Follow OpenCV's [documentation](https://docs.opencv.org/3.4.6/d7/d9f/tutorial_linux_install.html) to manually build OpenCV from source code. Note: You may need to modify [`WORKSPACE`] and [`opencv_linux.BUILD`] to point MediaPipe to your own OpenCV libraries, e.g., if OpenCV 4 is installed in "/usr/local/", you need to update the "linux_opencv" new_local_repository rule in [`WORKSPACE`] and "opencv" cc_library rule in [`opencv_linux.BUILD`] like the following: ```bash new_local_repository( name = "linux_opencv", build_file = "@//third_party:opencv_linux.BUILD", path = "/usr/local", ) cc_library( name = "opencv", srcs = glob( [ "lib/libopencv_core.so", "lib/libopencv_highgui.so", "lib/libopencv_imgcodecs.so", "lib/libopencv_imgproc.so", "lib/libopencv_video.so", "lib/libopencv_videoio.so", ], ), hdrs = glob(["include/opencv4/**/*.h*"]), includes = ["include/opencv4/"], linkstatic = 1, visibility = ["//visibility:public"], ) ``` 8. Run the [Hello World desktop example](./hello_world_desktop.md). ```bash username@DESKTOP-TMVLBJ1:~/mediapipe$ export GLOG_logtostderr=1 # Need bazel flag 'MEDIAPIPE_DISABLE_GPU=1' as desktop GPU is currently not supported username@DESKTOP-TMVLBJ1:~/mediapipe$ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \ mediapipe/examples/desktop/hello_world:hello_world # Should print: # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! ``` ## Installing using Docker This will use a Docker image that will isolate mediapipe's installation from the rest of the system. 1. [Install Docker](https://docs.docker.com/install/#supported-platforms) on your host system. 2. Build a docker image with tag "mediapipe". ```bash $ git clone https://github.com/google/mediapipe.git $ cd mediapipe $ docker build --tag=mediapipe . # Should print: # Sending build context to Docker daemon 147.8MB # Step 1/9 : FROM ubuntu:latest # latest: Pulling from library/ubuntu # 6abc03819f3e: Pull complete # 05731e63f211: Pull complete # ........ # See http://bazel.build/docs/getting-started.html to start a new project! # Removing intermediate container 82901b5e79fa # ---> f5d5f402071b # Step 9/9 : COPY . /mediapipe/ # ---> a95c212089c5 # Successfully built a95c212089c5 # Successfully tagged mediapipe:latest ``` 3. Run the [Hello World desktop example](./hello_world_desktop.md). ```bash $ docker run -it --name mediapipe mediapipe:latest root@bca08b91ff63:/mediapipe# GLOG_logtostderr=1 bazel run --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hello_world:hello_world # Should print: # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! # Hello World! ``` 4. Build a MediaPipe Android example. ```bash $ docker run -it --name mediapipe mediapipe:latest root@bca08b91ff63:/mediapipe# bash ./setup_android_sdk_and_ndk.sh # Should print: # Android NDK is now installed. Consider setting $ANDROID_NDK_HOME environment variable to be /root/Android/Sdk/ndk-bundle/android-ndk-r18b # Set android_ndk_repository and android_sdk_repository in WORKSPACE # Done root@bca08b91ff63:/mediapipe# bazel build -c opt --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu:objectdetectiongpu # Should print: # Target //mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu:objectdetectiongpu up-to-date: # bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu/objectdetectiongpu_deploy.jar # bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu/objectdetectiongpu_unsigned.apk # bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectiongpu/objectdetectiongpu.apk # INFO: Elapsed time: 144.462s, Critical Path: 79.47s # INFO: 1958 processes: 1 local, 1863 processwrapper-sandbox, 94 worker. # INFO: Build completed successfully, 2028 total actions ``` [`WORKSPACE`]: https://github.com/google/mediapipe/blob/master/WORKSPACE [`opencv_linux.BUILD`]: https://github.com/google/mediapipe/tree/master/third_party/opencv_linux.BUILD [`opencv_macos.BUILD`]: https://github.com/google/mediapipe/tree/master/third_party/opencv_macos.BUILD [`ffmpeg_macos.BUILD`]:https://github.com/google/mediapipe/tree/master/third_party/ffmpeg_macos.BUILD [`setup_opencv.sh`]: https://github.com/google/mediapipe/blob/master/setup_opencv.sh