MediaPipe之iOS開發(fā)

MediaPipe是谷歌開源的機器學習框架,用于處理視頻、音頻等時間序列數(shù)據(jù)。
MediaPipe Solutions提供了16個Solutions: 人臉檢測、Face Mesh(面部網(wǎng)格)、虹膜、手勢、姿態(tài)、人體、人物分割、頭發(fā)分割、目標檢測、Box Tracking、Instant Motion Tracking、3D目標檢測、特征匹配等。

face_mesh_ar_effects.gif

JAVA

提前安裝Java JDK11,之前安裝jdk8沒問題,升級后就不行了,查看說需要jdk11。
查看:

java -version

環(huán)境安裝

macOS環(huán)境

  • 安裝Homebrew
/bin/bash -c "$(curl -fsSL \
https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
//國內(nèi)用戶可用一鍵安裝腳本:
/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初始化后產(chǎn)生的日志如下:

==> 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設(shè)置為默認的python版本,并安裝six庫,這是TensorFlow的需要:
pip3 install --user six
  • 查看安裝結(jié)果:
    cd 到mediapipe所在的目錄,執(zhí)行
export GLOG_logtostderr=1
// 需要bazel設(shè)置環(huán)境變量'MEDIAPIPE_DISABLE_GPU=1',因為桌面GPU當前不受支持
bazel run --define MEDIAPIPE_DISABLE_GPU=1 \
    mediapipe/examples/desktop/hello_world:hello_world

打印:Hello World!
Hello World!
表示安裝完成!

iOS環(huán)境

  • 安裝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.

則按照提示執(zhí)行:

(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文件中的版本號,但這樣可能會出現(xiàn)問題。

  • 安裝TensorFlow依賴的Python庫six: pip3 install --user six
  • 克隆MediaPipe庫:git clone https://github.com/google/mediapipe.git
  • 設(shè)置唯一的bundle ID前綴,可通過運行命令來獲得這個唯一前綴:
python3 mediapipe/examples/ios/link_local_profiles.py

Bazel

bazel是一個多平臺編譯和構(gòu)建工具。使用bazel構(gòu)建項目,在項目根目錄下必須包含一個WORKSPACE文件,然后在該文件中做相應的配置。WORKSPACE包含bazel資源,是項目的根。

WORKSPACE:用于描述項目所需的構(gòu)建規(guī)則;
BUILD:描述文件,一個BUILD描述文件即為一個package包

Bazel把代碼劃分成package包,package包可以理解為一個目錄,這個目錄里面包含了源文件和一個描述文件,描述文件就是BUILD文件。一個包需包含一個BUILD描述文件。

構(gòu)建應用:bazel build //app:hello-world
構(gòu)建應用指定架構(gòu):bazel build -c opt --config=ios_arm64 //app:hello-world
運行應用:bazel run //app:hello-world

//: 表示根目錄,上面指令表示構(gòu)建根目錄中app文件目錄BUILD的name為hello-world的應用或包。
visibility:public 表示我們的可見域

模擬器構(gòu)建:bazel build --features=apple.skip_codesign_simulator_bundles //your/target
注意:需要使用受權(quán)限保護的API,則不能使用模擬器構(gòu)建,也需要簽名打包才可以。

創(chuàng)建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執(zhí)行在homebrew /bin/文件中。

  • 在配置選項卡中選擇MediaPipe配置,然后按下下面的Generate生成按鈕。

  • 輸入項目名稱,為項目選擇WORKSPACE文件。

    Tulsi.app執(zhí)行時報錯如圖:

tulsierror.png

解決方案:1. 執(zhí)行brew info opencv@3,查看所有依賴是否安裝

  1. 檢查bazel版本是否符合要求,因下載了最新的bazel版本且把.bazelversion文件中的版本號修改為了最新版本。修改回來后,按照錯誤提示執(zhí)行腳本,就解決了問題

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 表示構(gòu)建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”中的代碼鏈接到可執(zhí)行文件中,收集和編譯“deps”中的資源,并將其與可執(zhí)行文件一起放在.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"],
)

打包應用是需要對應的配置文件,從開發(fā)者中心下載通用的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。則執(zhí)行命令把它做一個符號鏈接:

cd mediapipe
ln -s ~/Downloads/Profile_common.mobileprovision mediapipe/provisioning_profile.mobileprovision

MediaPipe On iOS

在官方的Hello World! On iOS事例中,添加相關(guān)依賴時,在BUILD文件data中添加:

"http://mediapipe/graphs/edge_detection:mobile_gpu_binary_graph",

改為:

 "http://mediapipe/graphs/edge_detection:mobile_gpu.binarypb",

按照文檔基本可以完成實例的安裝與運行!

相關(guān)參考文章

Mediapipe – 全身包含身體、手部、面部所有關(guān)鍵點標注位置對應圖

Mediapipe - 將Mediapipe handtracking封裝成動態(tài)鏈接庫dll/so,實現(xiàn)在桌面應用中嵌入手勢識別功能

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容