◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/AIモデル
◉ AIモデル/2026-07-15上級

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

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

Rork Max236Core ML6TensorFlow LiteオンデバイスAI13React Native239Expo219画像認識

✦ プレミアム記事

写真を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/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◉ AI モデル2026-09-12
iOS 27 の新機能を Rork に頼むと、エラーにならないまま古い書き方へ戻ります
9月14日に iOS 27 が配信されます。生成 AI が知らない API を頼まれたときには、落ちる失敗と落ちない失敗の二種類が起きます。標準 Rork と Rork Max で性質が違う理由と、返ってきたコードを確かめる三つの順番を整理しました。
◉ AI モデル2026-08-07
MCP のツールを減らしても軽くならない — 定義 2,377 バイトと応答 110,298 バイトを測り直した記録
壁紙カタログ用のMCPサーバを依存なしの最小構成で書き直し、ツール定義2,377バイトと応答110,298バイトを実測した記録です。削るべきは応答側であること、ツール統合の本当の理由が見分けやすさにあることを、測定ハーネスと3つの設計ルールとともに示します。
◉ AI モデル2026-05-05
Rork Max で AI 面接コーチアプリを作る:音声録音・Claude 評価・進捗管理の実装ガイド
Rork Maxで音声録音、Whisperによる文字起こし、Claude APIでの回答評価を組み合わせたAI面接コーチアプリを構築します。Cloudflare Workersでの評価API実装、セッション管理と進捗トラッキング、フリーミアム課金設計、本番環境の注意点まで一気通貫で扱います。