MediaPipe是谷歌開源的機器學習框架,用于處理視頻、音頻等時間序列數據。
MediaPipe Solutions提供了16個Solutions: 人臉檢測、Face Mesh(面部網格)、虹膜、手勢、姿態、人體、人物分割、頭發分割、目標檢測、Box Tracking、Instant Motion Tracking、3D目標檢測、特征匹配等。
JAVA
提前安裝Java JDK11,之前安裝jdk8沒問題,升級后就不行了,查看說需要jdk11。
查看:
java -version
環境安裝
macOS環境
- 安裝Homebrew
/bin/bash -c "$(curl -fsSL \
https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
//國內用戶可用一鍵安裝腳本:
/bin/zsh -c"$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
- 安裝Xcode及命令行工具
xcode-select --install
- 安裝Bazelisk,
brew install bazelisk
- 克隆MediaPipe庫文件
git clone https://github.com/google/mediapipe.git
cd mediapipe
- 安裝OpenCV和FFmpeg,FFmpeg將通過OpenCV安裝
brew install opencv@3
//glog依賴項導致了一個已知問題,卸載glog
brew uninstall --ignore-dependencies glog
若有下載依賴報錯,則先下載依賴
brew install openexr
brew install libvmaf
brew install libx11
brew install libarchive
brew install opencv@3
//glog依賴項導致了一個已知問題,卸載glog
brew uninstall --ignore-dependencies glog
查看opencv的版本及信息brew info opencv@3
:
opencv@3: stable 3.4.16 (bottled) [keg-only]
opencv@3初始化后產生的日志如下:
==> Summary
/usr/local/Cellar/opencv@3/3.4.16_3: 675 files, 211MB
==> Running `brew cleanup opencv@3`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
==> Caveats
==> opencv@3
opencv@3 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.
If you need to have opencv@3 first in your PATH, run:
echo 'export PATH="/usr/local/opt/opencv@3/bin:$PATH"' >> ~/.zshrc
For compilers to find opencv@3 you may need to set:
export LDFLAGS="-L/usr/local/opt/opencv@3/lib"
export CPPFLAGS="-I/usr/local/opt/opencv@3/include"
For pkg-config to find opencv@3 you may need to set:
export PKG_CONFIG_PATH="/usr/local/opt/opencv@3/lib/pkgconfig"
- 查看python版本
python -V
,將python3設置為默認的python版本,并安裝six
庫,這是TensorFlow的需要:
pip3 install --user six
- 查看安裝結果:
cd 到mediapipe所在的目錄,執行
export GLOG_logtostderr=1
// 需要bazel設置環境變量'MEDIAPIPE_DISABLE_GPU=1',因為桌面GPU當前不受支持
bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
mediapipe/examples/desktop/hello_world:hello_world
打印:Hello World!
Hello World!
表示安裝完成!
iOS環境
- 安裝Xcode命令行工具
xcode-select --install
- 查看是否成功:
gcc -v
- 刪除舊工具:
sudo xcode-select --switch /Library/Developer/CommandLineTools/ 或: sudo rm -rf /Library/Developer/CommandLineTools // 這兩個命令沒嘗試過
- 查看是否成功:
- brew安裝Bazel:
brew install bazel
//查看版本
bazel --version
//更新
brew upgrade bazel
如果報錯:
ERROR: The project you're trying to build requires Bazel 5.0.0 (specified in /Users/jion/Desktop/MyGithub/GitBlog/2022/MediaPipe/mediapipe/.bazelversion), but it wasn't found in /usr/local/Cellar/bazel/5.1.1/libexec/bin.
則按照提示執行:
(cd "/usr/local/Cellar/bazel/5.1.1/libexec/bin" && curl -fLO https://releases.bazel.build/5.0.0/release/bazel-5.0.0-darwin-x86_64 && chmod +x bazel-5.0.0-darwin-x86_64)
或修改.bazelversion
文件中的版本號,但這樣可能會出現問題。
- 安裝TensorFlow依賴的Python庫six:
pip3 install --user six
- 克隆MediaPipe庫:
git clone https://github.com/google/mediapipe.git
- 設置唯一的bundle ID前綴,可通過運行命令來獲得這個唯一前綴:
python3 mediapipe/examples/ios/link_local_profiles.py
Bazel
bazel是一個多平臺編譯和構建工具。使用bazel構建項目,在項目根目錄下必須包含一個WORKSPACE
文件,然后在該文件中做相應的配置。WORKSPACE包含bazel資源,是項目的根。
WORKSPACE:用于描述項目所需的構建規則;
BUILD:描述文件,一個BUILD
描述文件即為一個package包
Bazel把代碼劃分成package包,package包可以理解為一個目錄,這個目錄里面包含了源文件和一個描述文件,描述文件就是BUILD
文件。一個包需包含一個BUILD
描述文件。
構建應用:bazel build //app:hello-world
構建應用指定架構:bazel build -c opt --config=ios_arm64 //app:hello-world
運行應用:bazel run //app:hello-world
//
: 表示根目錄,上面指令表示構建根目錄中app文件目錄BUILD
的name為hello-world的應用或包。
visibility:public
表示我們的可見域
模擬器構建:bazel build --features=apple.skip_codesign_simulator_bundles //your/target
注意:需要使用受權限保護的API,則不能使用模擬器構建,也需要簽名打包才可以。
創建Xcode項目
- 我們將使用一個工具名為
Tulsi
,來生成Xcode項目用Bazel
來build Configuration。
//cd 到 mediapipe文件的同級目錄
git clone https://github.com/bazelbuild/tulsi.git
cd tulsi
# remove Xcode version from Tulsi's .bazelrc (see http://github.com/bazelbuild/tulsi#building-and-installing):
sed -i .orig '/xcode_version/d' .bazelrc
# build and run Tulsi:
sh build_and_run.sh
這將安裝一個Tulsi.app
在你的home文件的Applications
文件中,如何使Tulsi.app。
使用
Tulsi.app
打開mediapipe/Mediapipe.tulsiproj
。注意:如果Tulsi
顯示錯誤說“Bazel could not be found”,在選項中點擊“Bazel…”按鈕,選擇bazel
執行在homebrew/bin/
文件中。在配置選項卡中選擇MediaPipe配置,然后按下下面的
Generate
生成按鈕。-
輸入項目名稱,為項目選擇
WORKSPACE
文件。Tulsi.app
執行時報錯如圖:
解決方案:1. 執行brew info opencv@3
,查看所有依賴是否安裝
- 檢查bazel版本是否符合要求,因下載了最新的bazel版本且把
.bazelversion
文件中的版本號修改為了最新版本。修改回來后,按照錯誤提示執行腳本,就解決了問題
WORKSPACE文件:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
name = "build_bazel_rules_apple",
sha256 = "4161b2283f80f33b93579627c3bd846169b2d58848b0ffb29b5d4db35263156a",
url = "https://github.com/bazelbuild/rules_apple/releases/download/0.34.0/rules_apple.0.34.0.tar.gz",
)
load(
"@build_bazel_rules_apple//apple:repositories.bzl",
"apple_rules_dependencies",
)
apple_rules_dependencies()
load(
"@build_bazel_rules_swift//swift:repositories.bzl",
"swift_rules_dependencies",
)
swift_rules_dependencies()
load(
"@build_bazel_rules_swift//swift:extras.bzl",
"swift_rules_extra_dependencies",
)
swift_rules_extra_dependencies()
load(
"@build_bazel_apple_support//lib:repositories.bzl",
"apple_support_dependencies",
)
apple_support_dependencies()
BUILD文件:
# @build_bazel_rules_apple//apple:ios.bzl 表示構建iOS平臺的bundle
# ios_application 表示iOS應用,
load("@build_bazel_rules_apple//apple:ios.bzl", "ios_application")
# objc庫文件
objc_library(
name = "Lib",
srcs = glob([
"**/*.h",
"**/*.m",
]),
data = [
":Main.storyboard",
],
)
# 將“deps”中的代碼鏈接到可執行文件中,收集和編譯“deps”中的資源,并將其與可執行文件一起放在.app bundle里, 然后輸出一個.ipa應用程序包在他的Payload文件中。
ios_application(
name = "App",
bundle_id = "com.example.app",
families = ["iphone", "ipad"],
infoplists = [":Info.plist"],
minimum_os_version = "15.0",
deps = [":Lib"],
)
打包應用是需要對應的配置文件,從開發者中心下載通用的profile.mobileprovision
配置文件,
例如:
profile.mobileprovision
對應的bunld_id是com.companyname.*
,
則需要打開mediapipe/examples/ios/bundle_id.bzl
文件
將BUNDLE_ID_PREFIX = "*SEE_IOS_INSTRUCTIONS*.mediapipe.examples"
修改為BUNDLE_ID_PREFIX = "com.companyname"
然后將您的配置文件符號鏈接或復制到mediapipe/mediapipe
路徑下,下載的文件在~/Downloads
目錄下,文件名為Profile_common.mobileprovision
。則執行命令把它做一個符號鏈接:
cd mediapipe
ln -s ~/Downloads/Profile_common.mobileprovision mediapipe/provisioning_profile.mobileprovision
MediaPipe On iOS
在官方的Hello World! On iOS
的事例中,添加相關依賴時,在BUILD
文件data
中添加:
"http://mediapipe/graphs/edge_detection:mobile_gpu_binary_graph",
改為:
"http://mediapipe/graphs/edge_detection:mobile_gpu.binarypb",
按照文檔基本可以完成實例的安裝與運行!
相關參考文章
Mediapipe – 全身包含身體、手部、面部所有關鍵點標注位置對應圖
Mediapipe - 將Mediapipe handtracking封裝成動態鏈接庫dll/so,實現在桌面應用中嵌入手勢識別功能