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
中添加:
"//mediapipe/graphs/edge_detection:mobile_gpu_binary_graph",
改为:
"//mediapipe/graphs/edge_detection:mobile_gpu.binarypb",
按照文档基本可以完成实例的安装与运行!
相关参考文章
Mediapipe – 全身包含身体、手部、面部所有关键点标注位置对应图
Mediapipe - 将Mediapipe handtracking封装成动态链接库dll/so,实现在桌面应用中嵌入手势识别功能