美文网首页
MediaPipe之iOS开发

MediaPipe之iOS开发

作者: 猪猪行天下 | 来源:发表于2022-08-15 11:19 被阅读0次

    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,实现在桌面应用中嵌入手势识别功能

    相关文章

      网友评论

          本文标题:MediaPipe之iOS开发

          本文链接:https://www.haomeiwen.com/subject/azwkgrtx.html