add support for MacOS with Apple Silicon M1, update README.md, add build_macos_desktop_examples.sh

This commit is contained in:
Yafei Zhao 2021-09-23 15:55:48 +08:00
parent a715f1ec4d
commit 702ae1769a
4 changed files with 193 additions and 3 deletions

View File

@ -1 +1 @@
4.1.0
3.7.2

View File

@ -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

View File

@ -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

View File

@ -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__