Rust ✖️ Executorch ✖️ iOS で YoloX を動かす
今回は、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-YOLOX
を Xcode
で開き、dependencies
に先ほどの Engine Swift Package を追加してください。
最後に、端末にアプリをインストールしてください。
最後に
当初の計画では、勉強も兼ねて Android で実装しようとしたのですが、Xnnpack デリゲートも Vulkan デリゲートもまともに動かなかったので、昨日からiOS用にアプリを突貫で作成しました。
Executorch
がもう少し成熟したら、もう一度チャレンジしてみようと思います。
Discussion