RORK LABEN
PLAY — Google Play の target API level 36 要件が昨日8月31日に発効しました。今日以降、新規アプリと既存アプリの更新は Android 16 対応が必須ですVISIBILITY — API 35 のままのアプリは掲載こそ続きますが、新しい Android 版のユーザーには表示されなくなります。エラーが出ないまま新規インストールだけが減る点に注意が要りますEXTENSION — 間に合わなかった場合は、Play Console から2026年11月1日までの延長申請が出せます。恒久対応の計画とセットで進めるのが実務的ですAPPLE — Apple 側は9月9日にイベント、iOS 27 の正式リリースは9月14日と報じられています。生成したアプリの iOS 27 実機確認はリリース週の前に済ませておきたいところですEXPO — Expo が expo-paste-input を公開しました(8月28日)。React Native の TextInput に画像・GIF・ステッカーの貼り付けを追加するネイティブモジュールですEAS — EAS Observe が8月20日に GA になりました。クラッシュや性能の観測を、ビルドや配信と同じ EAS 上で持てるようになっていますPLAY — Google Play の target API level 36 要件が昨日8月31日に発効しました。今日以降、新規アプリと既存アプリの更新は Android 16 対応が必須ですVISIBILITY — API 35 のままのアプリは掲載こそ続きますが、新しい Android 版のユーザーには表示されなくなります。エラーが出ないまま新規インストールだけが減る点に注意が要りますEXTENSION — 間に合わなかった場合は、Play Console から2026年11月1日までの延長申請が出せます。恒久対応の計画とセットで進めるのが実務的ですAPPLE — Apple 側は9月9日にイベント、iOS 27 の正式リリースは9月14日と報じられています。生成したアプリの iOS 27 実機確認はリリース週の前に済ませておきたいところですEXPO — Expo が expo-paste-input を公開しました(8月28日)。React Native の TextInput に画像・GIF・ステッカーの貼り付けを追加するネイティブモジュールですEAS — EAS Observe が8月20日に GA になりました。クラッシュや性能の観測を、ビルドや配信と同じ EAS 上で持てるようになっています
記事一覧/AIモデル
AIモデル/2026-07-15上級

オンデバイス画像認識、React Native の TFLite か Rork Max の Core ML か — 同じ題材で両方組んで決めた選び方

端末内で画像を分類する機能を、React Native に TFLite を積んで作るか、Rork Max のネイティブ Swift と Core ML で作るか。同じ題材を両方で組み、端から端までの内訳を測って選び方を整理しました。

Rork Max232Core ML6TensorFlow LiteオンデバイスAI13React Native233Expo192画像認識

プレミアム記事

写真を1枚選ぶと、それが夜景なのか、空なのか、抽象的なパターンなのかを、端末の中だけで判定したい。壁紙アプリに小さな分類機能を足そうとしたとき、手が止まったのはモデル選びではありませんでした。

React Native(Expo)側に TensorFlow Lite を積むのか。Rork Max が吐くネイティブ Swift で Core ML に寄せるのか。詰まったのはそこです。

料金にも差があります。通常の Rork は無料から始められて有料が月25ドル、Rork Max は月200ドル。個人開発の財布には、決して軽い差ではありません。

結局、両方を同じ題材で組んでみました。そこで分かったのは、私が比べるべきだったのは推論エンジンの速さではなかった、ということです。

比べる前に置いた3つの問い

手を動かす前に、判断を分ける問いを3つだけ決めました。これを決めずに実装に入ると、「動いた方」を選んでしまいます。

  1. その機能は、推論結果が出るまでユーザーを待たせてよいか — 撮影して1枚判定するのか、カメラのプレビューに追従するのか
  2. モデルは自分で差し替え続けるか — 出来合いの分類器を1つ積むだけなのか、自前データで再学習して更新し続けるのか
  3. 画像以外に、その端末の何を触りたくなるか — 半年後にウィジェットや写真ライブラリの深い部分へ手が伸びないか

この3問めが、後から効いてきました。

React Native 側 — TFLite を積むルートは1本ではありません

まず通常の Rork が吐く React Native(Expo)の土台に TFLite を積みます。ここで最初の分かれ道があります。

TensorFlow.js の React Native バインディングを経由するルートと、ネイティブの TFLite を JSI で直接叩くルート。同じ「TFLite を使う」でも、実装の手触りがまったく別物です。

観点tfjs-react-native 経由JSI 直結(react-native-fast-tflite 系)
画像の渡し方ファイル → Base64 文字列 → Uint8Array → テンソルArrayBuffer をゼロコピーに近い形で受け渡し
前処理の置き場JS 側(リサイズ・正規化もテンソル演算)ネイティブ側/フレームプロセッサに寄せられる
導入の容易さExpo Go でも試しやすい開発ビルドが必要
詰まりやすい箇所Base64 の往復と GC、テンソルの解放漏れモデルの入力仕様と型の食い違い

私は最初、手軽さに引かれて tfjs 経由で組みました。動きます。動きますが、シャッターを押してから結果が出るまで、一拍置かれる感触が残りました。

手軽な方のコード、そして残った引っかかり

// utils/classifyViaTfjs.ts
import * as tf from '@tensorflow/tfjs';
import { decodeJpeg } from '@tensorflow/tfjs-react-native';
import * as FileSystem from 'expo-file-system';
 
// 画像を「文字列」に変換してから読み戻す — ここが後で効いてきます
export async function classifyViaTfjs(model: tf.GraphModel, uri: string) {
  const b64 = await FileSystem.readAsStringAsync(uri, {
    encoding: FileSystem.EncodingType.Base64,
  });
 
  const bytes = tf.util.encodeString(b64, 'base64');
  const image = decodeJpeg(new Uint8Array(bytes.buffer));
 
  // 224x224 に落として -1〜1 に正規化し、バッチ次元を足す
  const input = tf.tidy(() =>
    tf.image.resizeBilinear(image, [224, 224]).div(127.5).sub(1).expandDims(0)
  );
 
  const logits = model.predict(input) as tf.Tensor;
  const probs = await logits.data();
 
  // tidy の外で作ったテンソルは自分で捨てます。ここを忘れると数十枚で膨らみます
  tf.dispose([image, input, logits]);
 
  return probs;
}

tf.tidy を挟んでいるのは、中間テンソルをまとめて回収するためです。ただし tidy は非同期処理を跨げないので、decodeJpeg の結果や predict の出力は自分で dispose する必要があります。ここを落とすと、数十枚流したあたりからメモリが目に見えて膨らみます。

なぜ気をつけるかというと、この手のリークは「開発中の10枚」では絶対に見えないからです。見えるのは、ユーザーがアルバムを延々スクロールした後です。

そして肝心の引っかかりは、リークではなく画像の渡し方の方にありました。ファイルを Base64 文字列にして、JS のブリッジを通して、また Uint8Array に戻す。2MB の写真なら、Base64 化した時点で約2.7MB の文字列がメモリに乗ります。

推論は速いのに、待たされる。この時点で、私が測るべき対象がはっきりしました。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
推論そのものより前処理と受け渡しが支配的になる理由と、その内訳を自分の端末で取るための計測ハーネス
TFLite を積む2つのルート(tfjs 経由と JSI 経由)の実装差と、片方で詰まる具体的な箇所
月25ドルと月200ドルの差が正当化される条件を、機能要件から逆算して判断する表
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

AI モデル2026-06-30
Rork のハイブリッドAIが知らぬ間にクラウドへ偏って課金が膨らんでいたとき — 経路選択を計測して切り分ける運用メモ
オンデバイス・エッジ・クラウドを振り分けるハイブリッドAIルーターが、判断ログの不在によって静かにクラウドへ偏り、課金が前月比1.7倍に膨らんだ事例の運用メモです。経路選択を記録して原因を切り分け、予算アラームで再発を止めるまでの手順を共有します。
AI モデル2026-06-19
Rork Max に月 $200 を払う前に、Expo でどこまで届くかを3階層で見極める
ウィジェットや Live Activities が欲しくなると Rork Max が視野に入りますが、その多くは標準 Rork の Expo 構成でも届きます。機能ごとに「Expo で届く・自作モジュールで届く・Max が現実解」の3階層に分け、課金前に実機で見極める手順を整理しました。
AI モデル2026-06-14
Rork(Expo)製アプリから Apple Foundation Models を呼ぶ — オンデバイスAIをネイティブモジュールで橋渡しする
Rork が生成する Expo(React Native)アプリから iOS のオンデバイスAI、Apple Foundation Models を呼ぶには、Swift 側のネイティブモジュールを挟む必要があります。Expo Modules API で橋渡しを書き、未対応端末ではクラウドへ逃がす構成を実装します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →