Open22

mediapipeビルド軌跡

かさじまかさじま

linuxビルド保存

setup_opencv.sh


v0.10.15
git clone --depth 1 --branch v0.10.15 https://github.com/google/mediapipe.git

sudo apt-get install -y \
    libopencv-core-dev \
    libopencv-highgui-dev \
    libopencv-calib3d-dev \
    libopencv-features2d-dev \
    libopencv-imgproc-dev \
    libopencv-video-dev

bazel build -c opt \
  --define MEDIAPIPE_DISABLE_GPU=1 \
  mediapipe/examples/desktop/hello_world


ERROR: An error occurred during the fetch of repository 'local_execution_config_python':
   Traceback (most recent call last):
        File "/home/kasajima/.cache/bazel/_bazel_kasajima/ec69075e0aaca140e5b15485961a345f/external/org_tensorflow/third_party/py/non_hermetic/python_configure.bzl", line 213, column 39, in _create_local_python_repository
                numpy_include = _get_numpy_include(repository_ctx, python_bin) + "/numpy"
        File "/home/kasajima/.cache/bazel/_bazel_kasajima/ec69075e0aaca140e5b15485961a345f/external/org_tensorflow/third_party/py/non_hermetic/python_configure.bzl", line 187, column 19, in _get_numpy_include
                return execute(
        File "/home/kasajima/.cache/bazel/_bazel_kasajima/ec69075e0aaca140e5b15485961a345f/external/org_tensorflow/third_party/remote_config/common.bzl", line 230, column 13, in execute
                fail(
Error in fail: Problem getting numpy include path.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'numpy'
Is numpy installed?

sudo apt install python3-pip -y
pip install numpy
かさじまかさじま

mediapipe windowsビルド

Windows へのインストールを参考にビルドする。

環境構築

パスは環境変数に追加せず、batでset PATHする。

MSYS2

手順通りインストールする。

  1. MSYS2 をインストール
  2. メニューの MSYS2 MSYS を開く
  3. パッケージをインストール
    pacman -S git patch unzip
    
かさじまかさじま

Visual C++ Build Tools & WinSDK

手順では Build Tools 2019 だが、今は 2022。VS2022 でもよい。
ワークロードで C++によるデスクトップ開発 にチェック

以下が選択されている。
ランタイム: MSVC v143 (VS2022)
SDK:Windows 11 SDK (10.0.22621.0)
ビルドだけなら何でもよいが、プロダクトだと環境を同じにしておいたほうが無難。

かさじまかさじま

Bazel 環境変数

ビルドツールとインクルードパスを設定する。

set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC
set BAZEL_WINSDK_FULL_VERSION=10.0.22621.0

BAZEL_VC

ビルドツールディレクトリのパス。

BAZEL_WINSDK_FULL_VERSION

C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0 の数字部分。

かさじまかさじま

Python

winget でサクッとインストール

winget install Python.Python.3.12

%LOCALAPPDATA%\Programs\Python\Python312 にインストールされる。

サポートバージョンは Python の設定ガイド によると 3.9 ~ 3.12。

かさじまかさじま

OpenCV

GitHub の opencv のリリースで 4.4.0 を取得する。

Yoctoの都合上4.4.0なので、これで検証している

ダウンロード

https://github.com/opencv/opencv/releases/tag/4.4.0 から opencv-4.4.0-vc14_vc15.exe をダウンロード。
exe を実行して展開。opencv フォルダが作成される。
これを C:\ に移動

設定

opencv_windows.BUILD で OPENCV_VERSION を 440 に変更

かさじまかさじま

mediapipe のビルド

v0.10.15 クローン

git clone --depth 1 --branch v0.10.15 https://github.com/google/mediapipe.git
かさじまかさじま

ビルド

setenv.bat

set PATH=C:\msys64\usr\bin;%PATH%
set PATH=%LOCALAPPDATA%\Programs\Python\Python312;%PATH%

set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC
set BAZEL_WINSDK_FULL_VERSION=10.0.22621.0

hello_world

bazelisk build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --action_env PYTHON_BIN_PATH="C://Users//%USERNAME%//AppData//Local//Programs//Python//Python312//python.exe" mediapipe/examples/desktop/hello_world
かさじまかさじま

エラー発生。numpy がないそうだ。

ERROR: Analysis of target '//mediapipe/examples/desktop/hello_world:hello_world' failed; build aborted: Problem getting numpy include path.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'numpy'
Is numpy installed?

numpy インストール

pip install numpy

numpy-2.1.2 がインストールされた。

かさじまかさじま

エラー発生。yarn がインストールできないそうだ。

ERROR: D:/dev/mediapipe/mediapipe/examples/desktop/hello_world/BUILD:19:10: //mediapipe/examples/desktop/hello_world:hello_world depends on //mediapipe/calculators/core:pass_through_calculator in repository @ which failed to fetch. no such package '@npm//@bazel/typescript': yarn_install failed:  ('"YARN_IGNORE_PATH="' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
'テ「ツツ廬NIT_CWD' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
)

(作業フォルダ)\external\build_bazel_rules_nodejs\internal\npm_install\npm_install.bzl をみると

        repository_ctx.file(
            "_yarn.cmd",
            content = """@echo off
set "YARN_IGNORE_PATH="
set “INIT_CWD=”
set “npm_config_registry=”
cd /D "{root}" && {yarn} {yarn_args}
""".format(

になっている。
は日本語環境だと期待通り動かない。
" に直す。
Patching Bazel Dependencies によれば yocto のようにダウンロードしたソースにパッチを充てる方式。

対象は WORKSPACE の Node dependencies でダウンロードしている rules_nodejs-5.8.2.tar.gz。

...
# Node dependencies
http_archive(
    name = "build_bazel_rules_nodejs",
    sha256 = "94070eff79305be05b7699207fbac5d2608054dd53e6109f7d00d923919ff45a",
    urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/5.8.2/rules_nodejs-5.8.2.tar.gz"],
)
...

rules_nodejs-5.8.2.tar.gz をローカルで展開。git 化して npm_install.bzl を編集。
パッチ作成
git diff > build_bazel_rules_nodejs_cannot_run_yarn_cmd.diff

パッチ中身

diff --git a/internal/npm_install/npm_install.bzl b/internal/npm_install/npm_install.bzl
index 77f5778..b008921 100644
--- a/internal/npm_install/npm_install.bzl
+++ b/internal/npm_install/npm_install.bzl
@@ -948,8 +948,8 @@ unset npm_config_registry
             "_yarn.cmd",
             content = """@echo off
 set "YARN_IGNORE_PATH="
-set “INIT_CWD=”
-set “npm_config_registry=”
+set "INIT_CWD="
+set "npm_config_registry="
 cd /D "{root}" && {yarn} {yarn_args}
 """.format(
                 root = root,

これを third_party フォルダに入れて、build_bazel_rules_nodejs 展開時にパッチを当てる。

# Node dependencies
http_archive(
    name = "build_bazel_rules_nodejs",
    sha256 = "94070eff79305be05b7699207fbac5d2608054dd53e6109f7d00d923919ff45a",
    urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/5.8.2/rules_nodejs-5.8.2.tar.gz"],
    patches = [
        "@//third_party:build_bazel_rules_nodejs_cannot_run_yarn_cmd.diff",
    ],
    patch_args = [
        "-p1",
    ],
)

これで build は問題なくできる。

かさじまかさじま

hello_world は OpenCV を必要としないので、ビルドエラーにならない。
Dependency Walker でみても OpenCV の dll は参照していない。

かさじまかさじま

object_detection_cpu

bazelisk build -c opt ^
  --define MEDIAPIPE_DISABLE_GPU=1 ^
  --action_env PYTHON_BIN_PATH="C://Users//%USERNAME%//AppData//Local//Programs//Python//Python312//python.exe" ^
  mediapipe/examples/desktop/object_detection:object_detection_cpu

エラー発生。

Repository rule llvm_configure defined at:
  C:/users/kasac/_bazel_kasac/p62qnbtr/external/llvm-raw/utils/bazel/configure.bzl:181:33: in <toplevel>
ERROR: An error occurred during the fetch of repository 'llvm-project':                                                                            
   Traceback (most recent call last):                                                                                                              
        File "C:/users/kasac/_bazel_kasac/p62qnbtr/external/llvm-raw/utils/bazel/configure.bzl", line 150, column 25, in _llvm_configure_impl      
                _overlay_directories(repository_ctx)                                                                                               
        File "C:/users/kasac/_bazel_kasac/p62qnbtr/external/llvm-raw/utils/bazel/configure.bzl", line 60, column 13, in _overlay_directories       
                fail(("Failed to execute overlay script: '{cmd}'\n" +
Error in fail: Failed to execute overlay script: 'C:/Users/kasac/AppData/Local/Programs/Python/Python312/python.exe C:/users/kasac/_bazel_kasac/p62qnbtr/external/llvm-raw/utils/bazel/overlay_directories.py --src C:/users/kasac/_bazel_kasac/p62qnbtr/external/llvm-raw --overlay C:/users/kasac/_bazel_kasac/p62qnbtr/external/llvm-raw/utils/bazel/llvm-project-overlay --target .'
Exited with code 1
stdout:

stderr:
Traceback (most recent call last):
  File "C:\users\kasac\_bazel_kasac\p62qnbtr\external\llvm-raw\utils\bazel\overlay_directories.py", line 99, in <module>
    main(parse_arguments())
  File "C:\users\kasac\_bazel_kasac\p62qnbtr\external\llvm-raw\utils\bazel\overlay_directories.py", line 85, in main
    _symlink_abs(
  File "C:\users\kasac\_bazel_kasac\p62qnbtr\external\llvm-raw\utils\bazel\overlay_directories.py", line 69, in _symlink_abs
    os.symlink(os.path.abspath(from_path), os.path.abspath(to_path))
OSError: [WinError 1314] クライアントは要求された特権を保有していません。: 'C:\\users\\kasac\\_bazel_kasac\\p62qnbtr\\external\\llvm-raw\\utils\\bazel\\llvm-project-overlay\\.bazelignore' -> 'C:\\users\\kasac\\_bazel_kasac\\p62qnbtr\\external\\llvm-project\\.bazelignore'
かさじまかさじま

OSError: [WinError 1314] クライアントは要求された特権を保有していません。: 'C:\users\kasac\_bazel_kasac\p62qnbtr\external\llvm-raw\utils\bazel\llvm-project-overlay\.bazelignore'
->
'C:\users\kasac\_bazel_kasac\p62qnbtr\external\llvm-project\.bazelignore'

問題のコードは os.symlink() を使っている。
これは管理者権限でないと使えない。
"C:\Users\kasac_bazel_kasac\p62qnbtr\external\llvm-raw\utils\bazel\overlay_directories.py"

def _symlink_abs(from_path, to_path):
    os.symlink(os.path.abspath(from_path), os.path.abspath(to_path))

mklink に変更。

def _symlink_abs(from_path, to_path):
    if os.name == "nt":
        from subprocess import call
        call(['mklink', os.path.abspath(to_path), os.path.abspath(from_path)], shell=True)
    else:
        os.symlink(os.path.abspath(from_path), os.path.abspath(to_path))

また別のエラー発生。

ERROR: An error occurred during the fetch of repository 'llvm-project':                                                                            
   Traceback (most recent call last):                                                                                                              
        File "C:/users/kasac/_bazel_kasac/p62qnbtr/external/llvm-raw/utils/bazel/configure.bzl", line 150, column 25, in _llvm_configure_impl      
                _overlay_directories(repository_ctx)
        File "C:/users/kasac/_bazel_kasac/p62qnbtr/external/llvm-raw/utils/bazel/configure.bzl", line 60, column 13, in _overlay_directories       
                fail(("Failed to execute overlay script: '{cmd}'\n" +
Error in fail: Failed to execute overlay script: 'C:/Users/kasac/AppData/Local/Programs/Python/Python312/python.exe C:/users/kasac/_bazel_kasac/p62qnbtr/external/llvm-raw/utils/bazel/overlay_directories.py --src C:/users/kasac/_bazel_kasac/p62qnbtr/external/llvm-raw --overlay C:/users/kasac/_bazel_kasac/p62qnbtr/external/llvm-raw/utils/bazel/llvm-project-overlay --target .'
Exited with code 256
かさじまかさじま

また権限系のエラー。
mklink 変更を戻して、管理者権限でビルド実行。

エラー発生。

ERROR: Analysis of target '//mediapipe/examples/desktop/object_detection:object_detection_cpu' failed; build aborted: error loading package '@org_tensorflow//tensorflow/compiler/mlir/lite': Every .bzl file must have a corresponding package, but '@llvm-project//mlir:tblgen.bzl' does not have one. Please create a BUILD file in the same or any parent directory. Note that this BUILD file does not need to do anything except exist.
かさじまかさじま

mediapipe のビルド 0.10.14

そもそも論で pypi で 0.10.15 がないということはビルドができないということだろう。
0.10.14 はあるのでやってみる。

v0.10.14 クローン

git clone --depth 1 --branch v0.10.14 https://github.com/google/mediapipe.git mediapipe-0.10.14

yarn 問題発生。diffする。
hellow_world build OK

かさじまかさじま

ビルドエラー

.\mediapipe/framework/port/opencv_video_inc.h(88): fatal error C1083: include ファイルを開けません。'opencv2/optflow.hpp':No such file or directory

OpenCV4 の最新ではあるのか?4.4.0 windows 版は無かった。
プリプロセッサで and 0 にして createOptFlow_DualTVL1() 定義しないようにした。

opencv_video_inc.h

#if CV_VERSION_MAJOR == 4 && !defined(MEDIAPIPE_MOBILE) && 0
#include <opencv2/optflow.hpp>
かさじまかさじま

ビルドエラー

stablehlo_reduce_window.cc

external/org_tensorflow/tensorflow/lite/kernels/stablehlo_reduce_window.cc(361): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
external/org_tensorflow/tensorflow/lite/kernels/stablehlo_reduce_window.cc(361): error C2143: 構文エラー: ',' が '*' の前にありません。
external/org_tensorflow/tensorflow/lite/kernels/stablehlo_reduce_window.cc(368): error C2065: 'depth': 定義されていない識別子です。

コメント部分でエラーがでている。意味不明。
└─┘ └─┘ がダメなのか?文字コード?
コード前に // でコメント行追加して、問題コメントとコードがくっつかないようにする。

stablehlo_reduce_window.cc

// └─┘   └─┘
//
template <class Op, class Type>
void ReduceWindowImpl(const Type* input, Type* output,
...
かさじまかさじま

リンク警告

INFO: From Linking mediapipe/examples/desktop/object_detection/object_detection_cpu.exe:
   ライブラリ bazel-out\x64_windows-opt\bin\mediapipe\examples\desktop\object_detection\object_detection_cpu.lib とオブジェクト bazel-out\x64_windows-opt\bin\mediapipe\examples\desktop\object_detection\object_detection_cpu.exp を作成中
LINK : warning LNK4217: シンボル 'TfLiteXNNPackDelegateOptionsDefault' ('xnnpack_delegate.lib(xnnpack_delegate.obj)' で定義) が 'tflite_inference_calculator.lo.lib(tflite_inference_calculator.obj)' によって関数 '"private: class absl::Status __cdecl mediapipe::TfLiteInferenceCalculator::LoadDelegate(class mediapipe::CalculatorContext *)" (?LoadDelegate@TfLiteInferenceCalculator@mediapipe@@AEAA?AVStatus@absl@@PEAVCalculatorContext@2@@Z)' 内でインポートされています
LINK : warning LNK4217: シンボル 'TfLiteXNNPackDelegateCreate' ('xnnpack_delegate.lib(xnnpack_delegate.obj)' で定義) が 'tflite_inference_calculator.lo.lib(tflite_inference_calculator.obj)' によって関数 '"private: class absl::Status __cdecl mediapipe::TfLiteInferenceCalculator::LoadDelegate(class mediapipe::CalculatorContext *)" (?LoadDelegate@TfLiteInferenceCalculator@mediapipe@@AEAA?AVStatus@absl@@PEAVCalculatorContext@2@@Z)' 内でインポートされています
LINK : warning LNK4217: シンボル 'TfLiteXNNPackDelegateDelete' ('xnnpack_delegate.lib(xnnpack_delegate.obj)' で定義) が 'tflite_inference_calculator.lo.lib(tflite_inference_calculator.obj)' によって関数 '"private: class absl::Status __cdecl mediapipe::TfLiteInferenceCalculator::LoadDelegate(class mediapipe::CalculatorContext *)" (?LoadDelegate@TfLiteInferenceCalculator@mediapipe@@AEAA?AVStatus@absl@@PEAVCalculatorContext@2@@Z)' 内でインポートされています
Target //mediapipe/examples/desktop/object_detection:object_detection_cpu up-to-date:
  bazel-bin/mediapipe/examples/desktop/object_detection/object_detection_cpu.exe

staticリンクしているからか?エラーではないので様子見。

かさじまかさじま

実行

set GLOG_logtostderr=1
bazel-bin\mediapipe\examples\desktop\object_detection\object_detection_cpu ^
  --calculator_graph_config_file=mediapipe\graphs\object_detection\object_detection_desktop_live.pbtxt

実行エラー
media/ssdlite_object_detection.tflite が見つからない
→ ダウンロードして配置
ssdlite_object_detection_labelmap.txt が見つからない
→ ダウンロードして配置

third_party\external_files.bzl
com_google_mediapipe_ssdlite_object_detection_tflite
com_google_mediapipe_ssdlite_object_detection_labelmap_txt
を手動でダウンロード

で、とりあえず動いた。