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
手順通りインストールする。
- MSYS2 をインストール
- メニューの
MSYS2 MSYS
を開く - パッケージをインストール
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)
ビルドだけなら何でもよいが、プロダクトだと環境を同じにしておいたほうが無難。
Bazelisk
winget でサクッとインストール
winget install bazelisk
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.
TensorFlow インストールの Windows 上のソースからビルドする
によれば LLVM がないからなのか?
とりあえず winget でインストール
winget install LLVM.LLVM
クリーン
bazelisk clean --expunge
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
を手動でダウンロード
で、とりあえず動いた。