From 702ae1769ae12744271c6e674fa5dfa636522af8 Mon Sep 17 00:00:00 2001 From: Yafei Zhao Date: Thu, 23 Sep 2021 15:55:48 +0800 Subject: [PATCH] add support for MacOS with Apple Silicon M1, update README.md, add build_macos_desktop_examples.sh --- .bazelversion | 2 +- README.md | 42 +++++++ build_macos_desktop_examples.sh | 149 +++++++++++++++++++++++++ mediapipe/framework/scheduler_queue.cc | 3 +- 4 files changed, 193 insertions(+), 3 deletions(-) create mode 100644 build_macos_desktop_examples.sh diff --git a/.bazelversion b/.bazelversion index ee74734aa..0b2eb36f5 100644 --- a/.bazelversion +++ b/.bazelversion @@ -1 +1 @@ -4.1.0 +3.7.2 diff --git a/README.md b/README.md index 9ea72ab8a..9a610d91d 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,48 @@ run code search using ### Build on MacOS +#### Prepare +1. install bazel/opencv/ffmpeg: +```bash +brew install bazel +brew install opencv@3 +brew install ffmpeg +``` + +2. Set .bazelversion: +Run +```bash +brew list bazel +``` +to get bazel version, which may print: +``` +/opt/homebrew/Cellar/bazel/4.1.0/bin/bazel +/opt/homebrew/Cellar/bazel/4.1.0/bin/bazel-4.1.0 +/opt/homebrew/Cellar/bazel/4.1.0/etc/bash_completion.d/bazel-complete.bash +/opt/homebrew/Cellar/bazel/4.1.0/libexec/bin/ (3 files) +/opt/homebrew/Cellar/bazel/4.1.0/share/zsh/site-functions/_bazel``` +``` + +Update .bazelversion: +```bash +echo 4.1.0 > .bazelversion +``` + +1. Set the right paths to opencv/ffmpeg in WORKSPACE (line 212~222), for example: +``` +new_local_repository( + name = "macos_opencv", + build_file = "@//third_party:opencv_macos.BUILD", + path = "/opt/homebrew/Cellar/opencv@3/3.4.14_3", +) + +new_local_repository( + name = "macos_ffmpeg", + build_file = "@//third_party:ffmpeg_macos.BUILD", + path = "/opt/homebrew/Cellar/ffmpeg/4.4_2", +) +``` + #### CPU: Apple Silicon M1 1. Build "hello_world": ```bash diff --git a/build_macos_desktop_examples.sh b/build_macos_desktop_examples.sh new file mode 100644 index 000000000..87d5b9e4a --- /dev/null +++ b/build_macos_desktop_examples.sh @@ -0,0 +1,149 @@ +#!/bin/bash +# Copyright 2020 The MediaPipe Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ========================================================================= +# +# Script to build/run all MediaPipe desktop example apps (with webcam input). +# +# CPU options: [arm64/m1/M1, x86_64, i386] +# To only build "face_detection" app and store it in out_dir for MacOS with M1 CPU: +# $ ./build_desktop_examples.sh -c m1 -d out_dir -a face_detection +# Omitting -d and the associated directory saves all generated apps in the +# current directory. +# To build and run all apps and store them in out_dir for MacOS with M1 CPU: +# $ ./build_desktop_examples.sh -c m1 -d out_dir +# Omitting -d and the associated directory saves all generated apps in the +# current directory. +# To build all apps and store them in out_dir for MacOS with x86_64 CPU: +# $ ./build_desktop_examples.sh -c x86_64 -d out_dir -b +# Omitting -d and the associated directory saves all generated apps in the +# current directory. +# To run all apps already stored in out_dir: +# $ ./build_desktop_examples.sh -d out_dir -r +# Omitting -d and the associated directory assumes all apps are in the current +# directory. + +set -e + +out_dir="." +build_only=false +run_only=false +# cpu options: [arm64/m1/M1, x86_64, i386] +# corresponding bazel cpu options: [darwin_arm64, darwin_x86_64, darwin] +cpu="arm64" +app_dir="mediapipe/examples/desktop" +app_name="" +bin_dir="bazel-bin" + +while [[ -n $1 ]]; do + case $1 in + -d) + shift + out_dir=$1 + ;; + -c | --cpu) + shift + cpu=$1 + ;; + -a | --app) + shift + app_name=$1 + ;; + -b) + build_only=true + ;; + -r) + run_only=true + ;; + *) + echo "Unsupported input argument $1." + exit 1 + ;; + esac + shift +done + +case $cpu in + x86_64 | i386) + cpu="darwin_$cpu" + ;; + arm64 | m1 | M1) + cpu="darwin_arm64" + ;; + *) + echo "Unsupported cpu argument $1." + exit 1 + ;; + esac + +echo "app_dir: $app_dir" +echo "out_dir: $out_dir" +echo "cpu: $cpu" +echo "app_name: $app_name" + +declare -a default_bazel_flags=(build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --cpu $cpu) +declare -a bazel_flags + +if [[ ! -z "${app_name}" ]]; then + echo "Only build app: ${app_dir}/${app_name}" + declare -a apps=("${app_dir}/${app_name}") +else + echo "Build all available apps under $app_dir" + apps="${app_dir}/*" +fi + +for app in ${apps}; do + if [[ -d "${app}" ]]; then + target_name=${app##*/} + if [[ "${target_name}" == "autoflip" || + "${target_name}" == "hello_world" || + "${target_name}" == "media_sequence" || + "${target_name}" == "object_detection_3d" || + "${target_name}" == "template_matching" || + "${target_name}" == "youtube8m" ]]; then + echo "Skip ${target_name}" + continue + fi + target="${app}:${target_name}_cpu" + + echo "=== Target: ${target}" + + if [[ $run_only == false ]]; then + bazel_flags=("${default_bazel_flags[@]}") + bazel_flags+=(${target}) + + bazel "${bazel_flags[@]}" + cp -f "${bin_dir}/${app}/"*"_cpu" "${out_dir}" + fi + if [[ $build_only == false ]]; then + if [[ ${target_name} == "object_tracking" ]]; then + graph_name="tracking/object_detection_tracking" + elif [[ ${target_name} == "upper_body_pose_tracking" ]]; then + graph_name="pose_tracking/upper_body_pose_tracking" + else + graph_name="${target_name}/${target_name}" + fi + if [[ ${target_name} == "holistic_tracking" || + ${target_name} == "iris_tracking" || + ${target_name} == "pose_tracking" || + ${target_name} == "upper_body_pose_tracking" ]]; then + graph_suffix="cpu" + else + graph_suffix="desktop_live" + fi + GLOG_logtostderr=1 "${out_dir}/${target_name}_cpu" \ + --calculator_graph_config_file=mediapipe/graphs/"${graph_name}_${graph_suffix}.pbtxt" + fi + fi +done diff --git a/mediapipe/framework/scheduler_queue.cc b/mediapipe/framework/scheduler_queue.cc index 57ee8a936..efad97282 100644 --- a/mediapipe/framework/scheduler_queue.cc +++ b/mediapipe/framework/scheduler_queue.cc @@ -26,8 +26,7 @@ #include "mediapipe/framework/port/status.h" #ifdef __APPLE__ -// #define AUTORELEASEPOOL @autoreleasepool -#define AUTORELEASEPOOL +#define AUTORELEASEPOOL @autoreleasepool #else #define AUTORELEASEPOOL #endif // __APPLE__