Zenn
🙆

Rust ✖️ Executorch ✖️ iOS で YoloX を動かす

2024/12/22に公開

今回は、YoloX をモバイルアプリで動かすサンプルを作成しました。
サンプルアプリの作成を通じて、二つのクレートを作成したのでサンプルアプリと合わせて紹介したいと思います。

TL;DR

  • Executorch のラッパークレート berry-executorch を作成
  • BYTETrack-cpp のRust移植版 jamtrack-rs を作成
  • 上記二つを使用してRustでバックエンドを書き、iPhoneで動作するサンプルアプリを作成

各リポジトリは以下の三つです。

動機

Meta は昨年から、デバイス用の推論ランタイム Executorch を活発に開発しています。
Pytorch との親和性が高いため、一度 Executorch を使ってモバイルアプリを作成したいと思い、今回の題材にしました。

Executorch のランタイム部分は C++ で実装されているので、必然的に C++ を使うことになります。
しかし、C++ だとクロスコンパイルの設定が面倒。(cargo コマンド一発で切り替えたい...)
それに、前処理と後処理を C++ を書きたくない(個人的意見)。

よって、ort のように Executorch の Rust bindings を作成することにしました。
それが、berry-executorch です。

また、単純にYoloXを実装しただけだと面白くないかなと思い、トラッキングもすることにしました。
以前に勉強の一環で BYTETrack の論文を読み、C++ 実装の移植を途中までしていたので、アドカレを機に移植を仕切ってアプリに実装しようかと思っておりました。
今回は時間に間に合いませんでした。(今後実装予定です。)

サンプルアプリについて

一番上の画像にアプリのスクショを載せておきました。
アプリは非常に単純なもので緑の四角の中に映る物体を検知し、バウンディングボックスとクラスとスコアを表示します。

モデルは全て CoreML を使って動いており、Nano, Tiny, Small の三つを選ぶことができます。
Small は後処理の時間が 120ms ぐらいかかってしまうので、後処理の速度改善も今後の課題です。
後処理の実装 1~10ms ぐらいに改善しました。

アプリのインストール方法

スクリプトを実行し、ビルド済み Executorch ライブラリをダウンロードしてください。

./scripts/setup-engine.sh

そして、以下のスクリプトで Swift Package を作成してください。

./scripts/build-pkg.sh

yolox-executorch-ios/ios/swift-pkg/Engine 直下に CEngine.xcframework が作成されていれば成功です。

そして、yolox-executorch-ios/ios/app/ET-YOLOXXcode で開き、dependencies に先ほどの Engine Swift Package を追加してください。

最後に、端末にアプリをインストールしてください。

最後に

当初の計画では、勉強も兼ねて Android で実装しようとしたのですが、Xnnpack デリゲートも Vulkan デリゲートもまともに動かなかったので、昨日からiOS用にアプリを突貫で作成しました。
Executorch がもう少し成熟したら、もう一度チャレンジしてみようと思います。

Discussion

ログインするとコメントできます