MediaPipe iOS集成

安装环境

macOS Monterey 12.3

一、安装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

可用以下命令删除旧版本
sudo xcode-select --switch /Library/Developer/CommandLineTools/
或:
sudo rm -rf /Library/Developer/CommandLineTools

  • 查看是否安装成功
$ gcc -v 
Apple clang version 14.0.0 (clang-1400.0.29.102)
Target: arm64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
  • 安装Bazelisk
$ brew install bazelisk
  • clone MediaPipe库到本地
$ git clone https://github.com/google/mediapipe.git
$ cd mediapipe
  • 安装OpenCV和FFmpeg
$ 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
  • 查看Opencv的版本及信息
$ brew info opencv@3
  • Opencv安装成功日志:

==> Summary
🍺  /opt/homebrew/Cellar/opencv@3/3.4.16_4: 656 files, 83.6MB
==> 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 /opt/homebrew,
because this is an alternate version of another formula.

If you need to have opencv@3 first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/opencv@3/bin:$PATH"' >> ~/.zshrc

For compilers to find opencv@3 you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/opencv@3/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/opencv@3/include"

二、下载安装Bazel

  • 在 macOS Catalina 或更高版本 (macOS >= 11) 上,根据 Apple 的新应用签名要求,您需要使用 curl 从终端下载安装程序。注意替换版本变量为你要下载的 Bazel 版本号。
$ export BAZEL_VERSION=5.2.0
$ curl -fLO "https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-installer-darwin-x86_64.sh"
  • 运行安装程序
$ chmod +x "bazel-$BAZEL_VERSION-installer-darwin-x86_64.sh"
./bazel-$BAZEL_VERSION-installer-darwin-x86_64.sh --user

--user 命令会将 Bazel 安装到系统的HOME/bin 目录中,并将 .bazelrc 路径设置为 $HOME/.bazelrc。使用 --help 命令查看其他安装选项。

  • 设置环境
    如果使用上述 --user 标志运行 Bazel 安装程序,那么 Bazel 可执行文件将安装到 HOME/bin 目录中。建议将此目录添加到默认路径中,如下所示:
export PATH="PATH:HOME/bin"

还可以将此命令添加到 /.bashrc、/.zshrc 或 ~/.profile 文件。

设置完成之后可以通过运行以下命令确认 Bazel 是否已成功安装:

$ bazel --version
bazel 5.3.1
  • 安装TensorFlow依赖的Python库
$ pip3 install --user six

查看python版本:python -V

  • 设置唯一的bundle ID前缀,通过以下命令获取
$ python3 mediapipe/examples/ios/link_local_profiles.py
  • 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!
表示安装完成!

使用Tulsi工具构建Xcode项目

  • 使用Tulsi工具生成Xcode项目,使用Bazel进行项目构建。
//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到应用程序里

  • 使用Tulsi.app打开mediapipe/Mediapipe.tulsiproj。注意:如果Tulsi显示错误说“Bazel could not be found”,在选项中点击“Bazel…”按钮,选择bazel执行在homebrew /bin/文件中。
  • 在配置选项卡中选择MediaPipe配置,然后按下下面的Generate生成按钮。
  • 输入项目名称,为项目选择WORKSPACE文件。
    Tulsi.app执行时报错如图:


    image.png
  • 解决方案
  1. 执行brew info opencv@3,查看所有依赖是否安装
  2. 检查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
  • 为你的项目命名并选择 Bazel WORKSPACE 文件的位置,然后单击“下一步”。


    image.png
  • 此时,你应该会看到项目的“Packages”选项卡。在这里,你将在项目中添加任何 BUILD 文件,并设置 Bazel 二进制文件的路径,该二进制文件将用于生成 Xcode 项目和编译。


    image.png
  • 单击“+”按钮添加您的 BUILD 文件。如果你有多个包含要直接构建的目标的 BUILD 文件,请重复此步骤。例如,你可能有一个包含您的规则ios_application和另一个包含ios_unit_test规则的 BUILD 文件。


    image.png
  • Tulsi 允许你设置生成的 Xcode 项目使用的各种选项。可能最有趣的是“'build' 选项”,Bazel 在编译期间直接使用这些选项。Tulsi 选项可以在两个地方设置,在项目级别(通过“默认选项”选项卡)和基于每代配置。“默认选项”选项卡中设置的值将在创建新的 Tulsi gen 配置时使用,并且对于在项目中工作的每个开发人员都相同的选项最有用。


    image.png
  • 设置项目的最后一步是创建一个或多个生成器配置。一个较大的项目可能有几个 gen 配置,可能一个具有 UI 层的源,另一个具有重要的支持库,等等... Gen 配置允许您根据自己的喜好定制 Xcode 索引的源集,而无需包括每个源文件以便编译。


    image.png
  • 单击“+”按钮将允许您添加新的生成器配置。双击现有配置将允许您对其进行编辑,“-”按钮可用于永久删除以前创建的配置。

请注意,如果你尚未保存项目,则在第一次添加配置时会要求您这样做。你几乎可以将项目保存在您喜欢的任何地方,但你将从将其签入源代码树中获得最大的好处,以便你团队中的其他开发人员可以共享它。tulsiconf-user除了包含可能是用户特定的设置(例如绝对路径)的文件之外,项目包是完全可共享的。


image.png
  • 设置项目后,你将希望从你的配置之一生成一个 Xcode 项目。这是通过导航到“配置”选项卡来完成的......


    image.png

    选择要生成的配置,并点击"生成"按钮.png

    选择保存项目的路径.png
  • 接下来你就可以将MediaPipe里的各种Demo用手机来进行演示了


    Xcode演示.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容