MediaPipe之iOS开发

MediaPipe是谷歌开源的机器学习框架,用于处理视频、音频等时间序列数据。
MediaPipe Solutions提供了16个Solutions: 人脸检测、Face Mesh(面部网格)、虹膜、手势、姿态、人体、人物分割、头发分割、目标检测、Box Tracking、Instant Motion Tracking、3D目标检测、特征匹配等。

face_mesh_ar_effects.gif

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执行时报错如图:

tulsierror.png

解决方案:1. 执行brew info opencv@3,查看所有依赖是否安装

  1. 检查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中添加:

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

改为:

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

按照文档基本可以完成实例的安装与运行!

相关参考文章

Mediapipe – 全身包含身体、手部、面部所有关键点标注位置对应图

Mediapipe - 将Mediapipe handtracking封装成动态链接库dll/so,实现在桌面应用中嵌入手势识别功能

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

推荐阅读更多精彩内容