ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-03-26中級

Edge AI × Antigravity — Core ML / TensorFlow Lite でオンデバイスAI推論アプリを開発する実践ガイド

Antigravity を活用し、Core ML や TensorFlow Lite でオンデバイスAI推論を行うモバイルアプリを効率的に開発する方法を解説します。モデル量子化からデプロイまでの実践手順を紹介。

edge-ai3core-ml3tensorflow-lite2on-device2antigravity435mobile-aimodel-quantization

取り組みの背景 — なぜ今「オンデバイスAI」なのか

クラウドAPIを呼び出すAI機能は手軽に実装できますが、レイテンシ、通信コスト、プライバシーの観点から限界があります。Edge AI(オンデバイスAI推論)は、モデルをデバイス上で直接実行することで、これらの課題を根本的に解決するアプローチです。

2026年現在、Apple の Core ML と Google の TensorFlow Lite はともにモバイル向けの推論エンジンとして成熟しており、Antigravity のAIエージェント機能を組み合わせることで、モデルの変換・量子化からアプリへの統合・テストまでを大幅に効率化できます。

Antigravity を使ってオンデバイスAI推論アプリを開発する実践的なワークフローを、Core ML(iOS)と TensorFlow Lite(Android / クロスプラットフォーム)の両方を順番に整理していきます。

Edge AI 開発の全体像とメリット

オンデバイスAIの開発フローは、大きく4つのフェーズに分かれます。

1. モデルの準備と変換

まずは学習済みモデルを用意し、モバイル向けのフォーマットに変換します。PyTorch や TensorFlow で学習したモデルを、Core ML(.mlmodel / .mlpackage)や TensorFlow Lite(.tflite)形式に変換する工程です。

2. モデルの量子化と最適化

モバイルデバイスのリソース制約に合わせて、モデルサイズを削減します。INT8量子化を適用すると、モデルサイズを最大75%削減しながら95%以上の精度を維持できるケースが多く、実用性が非常に高いです。

3. アプリへの統合

変換・最適化したモデルをiOSやAndroidのアプリに組み込みます。推論コードの実装、入出力のフォーマット変換、UIとの連携などが含まれます。

4. テストとパフォーマンス計測

実機でのレイテンシ計測、メモリ使用量の確認、バッテリー消費テストを行い、品質を担保します。

Antigravity のエージェントは、これら全フェーズでコード生成・レビュー・テスト自動化を支援してくれます。

Core ML でiOS向けオンデバイスAI推論を実装する

モデル変換スクリプトをAntigravityで生成

Antigravity のエージェントに、PyTorch モデルを Core ML 形式に変換するスクリプトの生成を依頼してみましょう。

# convert_to_coreml.py
# PyTorch の画像分類モデルを Core ML 形式に変換するスクリプト
import torch
import coremltools as ct
from torchvision.models import mobilenet_v3_small, MobileNet_V3_Small_Weights
 
# 学習済みモデルをロード
weights = MobileNet_V3_Small_Weights.DEFAULT
model = mobilenet_v3_small(weights=weights)
model.eval()
 
# トレース用のダミー入力
dummy_input = torch.randn(1, 3, 224, 224)
traced_model = torch.jit.trace(model, dummy_input)
 
# Core ML 形式に変換(量子化オプション付き)
mlmodel = ct.convert(
    traced_model,
    inputs=[ct.ImageType(name="image", shape=(1, 3, 224, 224))],
    convert_to="mlprogram",  # ML Program 形式(iOS 15+)
    compute_precision=ct.precision.FLOAT16,  # FP16量子化でサイズ半減
)
 
# 期待する出力:
# メタデータ付きの .mlpackage ファイルが生成される
mlmodel.save("ImageClassifier.mlpackage")
print("✅ Core ML モデルの変換が完了しました")
print(f"   モデルサイズ: 約 {mlmodel.__sizeof__() / 1024 / 1024:.1f} MB")

このスクリプトでは compute_precision=ct.precision.FLOAT16 を指定することで、精度を維持しつつモデルサイズを約50%削減しています。

Swift でのリアルタイム推論実装

変換したモデルをiOSアプリに組み込むSwiftコードも、Antigravity のインラインチャット(⌘+I)で効率的に生成できます。

// ImageClassifierService.swift
// Core ML モデルでリアルタイム画像分類を実行するサービス
import CoreML
import Vision
 
class ImageClassifierService {
    private let model: VNCoreMLModel
 
    init() throws {
        // Core ML モデルをロード
        let config = MLModelConfiguration()
        config.computeUnits = .all  // Neural Engine + GPU + CPU を自動選択
        let mlModel = try ImageClassifier(configuration: config).model
        self.model = try VNCoreMLModel(for: mlModel)
    }
 
    func classify(image: CGImage) async throws -> [(label: String, confidence: Float)] {
        return try await withCheckedThrowingContinuation { continuation in
            let request = VNCoreMLRequest(model: model) { request, error in
                if let error = error {
                    continuation.resume(throwing: error)
                    return
                }
                guard let results = request.results as? [VNClassificationObservation] else {
                    continuation.resume(returning: [])
                    return
                }
                // 上位5件の分類結果を返す
                let topResults = results.prefix(5).map {
                    (label: $0.identifier, confidence: $0.confidence)
                }
                continuation.resume(returning: topResults)
            }
            // Neural Engine を優先的に使用
            request.usesCPUOnly = false
 
            let handler = VNImageRequestHandler(cgImage: image)
            try? handler.perform([request])
        }
    }
}
 
// 期待する出力例:
// [("golden_retriever", 0.92), ("labrador", 0.05), ("dog", 0.02), ...]

computeUnits = .all を指定することで、Apple Neural Engine(ANE)が使えるデバイスでは自動的にANEが選択され、推論速度が大幅に向上します。

TensorFlow Lite でクロスプラットフォーム対応する

INT8量子化でモデルを軽量化

TensorFlow Lite では、ポストトレーニング量子化(PTQ)を使ってモデルサイズを劇的に削減できます。Antigravity のエージェントにスクリプト生成を依頼しましょう。

# quantize_tflite.py
# TensorFlow モデルを INT8 量子化した TFLite 形式に変換
import tensorflow as tf
import numpy as np
 
# 代表データセットのジェネレータ(量子化キャリブレーション用)
def representative_dataset():
    """量子化の精度を維持するための代表データを提供"""
    for _ in range(100):
        # 実際のユースケースに近い入力データを用意する
        data = np.random.rand(1, 224, 224, 3).astype(np.float32)
        yield [data]
 
# SavedModel を TFLite に変換
converter = tf.lite.TFLiteConverter.from_saved_model("saved_model/")
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.representative_dataset = representative_dataset
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
converter.inference_input_type = tf.uint8
converter.inference_output_type = tf.uint8
 
tflite_model = converter.convert()
 
# 量子化モデルを保存
with open("model_quantized.tflite", "wb") as f:
    f.write(tflite_model)
 
# 期待する出力:
# ファイルサイズが元のモデルの約25%に削減される
# 例: 16MB → 4MB(INT8量子化適用後)
original_size = 16.0  # MB(例)
quantized_size = len(tflite_model) / 1024 / 1024
print(f"✅ 量子化完了")
print(f"   元のサイズ: {original_size:.1f} MB")
print(f"   量子化後: {quantized_size:.1f} MB")
print(f"   削減率: {(1 - quantized_size / original_size) * 100:.0f}%")

INT8量子化により、モデルサイズを約75%削減しながら推論精度を95%以上維持できるのが大きなメリットです。

Kotlin でのAndroid向け推論実装

Antigravity の Agent モードを使って、Android 向けの推論コードを一括生成することも可能です。

// EdgeAIClassifier.kt
// TensorFlow Lite を使った Android 向け画像分類
import android.content.Context
import android.graphics.Bitmap
import org.tensorflow.lite.Interpreter
import org.tensorflow.lite.gpu.GpuDelegate
import java.io.FileInputStream
import java.nio.ByteBuffer
import java.nio.ByteOrder
import java.nio.MappedByteBuffer
import java.nio.channels.FileChannel
 
class EdgeAIClassifier(private val context: Context) {
 
    private var interpreter: Interpreter? = null
    private var gpuDelegate: GpuDelegate? = null
 
    fun initialize() {
        // GPU デリゲートでハードウェアアクセラレーション
        gpuDelegate = GpuDelegate()
        val options = Interpreter.Options().apply {
            addDelegate(gpuDelegate!!)
            setNumThreads(4) // GPU が使えない場合のフォールバック
        }
        val modelBuffer = loadModelFile("model_quantized.tflite")
        interpreter = Interpreter(modelBuffer, options)
    }
 
    fun classify(bitmap: Bitmap): List<Pair<String, Float>> {
        val inputBuffer = preprocessImage(bitmap)
        val outputBuffer = Array(1) { FloatArray(1000) }
 
        interpreter?.run(inputBuffer, outputBuffer)
 
        // 上位5件の結果をラベルとスコアのペアで返す
        return outputBuffer[0]
            .mapIndexed { index, score -> Pair(labels[index], score) }
            .sortedByDescending { it.second }
            .take(5)
    }
 
    // 期待する出力例:
    // [("golden_retriever", 0.91), ("labrador", 0.04), ...]
 
    private fun preprocessImage(bitmap: Bitmap): ByteBuffer {
        val buffer = ByteBuffer.allocateDirect(1 * 224 * 224 * 3)
        buffer.order(ByteOrder.nativeOrder())
        val resized = Bitmap.createScaledBitmap(bitmap, 224, 224, true)
        val pixels = IntArray(224 * 224)
        resized.getPixels(pixels, 0, 224, 0, 0, 224, 224)
        for (pixel in pixels) {
            buffer.put(((pixel shr 16) and 0xFF).toByte()) // R
            buffer.put(((pixel shr 8) and 0xFF).toByte())  // G
            buffer.put((pixel and 0xFF).toByte())            // B
        }
        return buffer
    }
 
    private fun loadModelFile(filename: String): MappedByteBuffer {
        val fd = context.assets.openFd(filename)
        val input = FileInputStream(fd.fileDescriptor)
        val channel = input.channel
        return channel.map(FileChannel.MapMode.READ_ONLY, fd.startOffset, fd.declaredLength)
    }
 
    fun release() {
        interpreter?.close()
        gpuDelegate?.close()
    }
 
    companion object {
        private val labels = listOf(/* ImageNet ラベル 1000件 */)
    }
}

GpuDelegate を利用することで、対応デバイスではGPUアクセラレーションが有効になり、CPU実行の2〜5倍の速度向上が期待できます。

Antigravity エージェントを活用した開発ワークフロー

ステップ1: プロジェクトの初期設定

Antigravity を起動し、新しいプロジェクトを作成します。AGENTS.md ファイルにモバイルAI開発向けの設定を記述すると、エージェントの精度が向上します。

<!-- AGENTS.md -->
# Edge AI モバイルアプリプロジェクト
 
## コンテキスト
- iOS: Swift + Core ML(iOS 17+対象)
- Android: Kotlin + TensorFlow Lite(API 26+対象)
- モデル: MobileNetV3 ベースの画像分類
 
## コーディング規約
- エラーハンドリングを省略しないこと
- メモリリークを防ぐため、モデルの解放処理を必ず実装すること
- パフォーマンス計測のログを推論コードに含めること

ステップ2: エージェントでコード生成

Antigravity の Agent モードで「Core ML の推論サービスクラスを作成して」と指示するだけで、上記のような実装が自動生成されます。さらに「TensorFlow Lite 版も同じインターフェースで作って」と追加指示すれば、クロスプラットフォーム対応のコードが得られます。

ステップ3: テストとベンチマーク

Antigravity のエージェントに「推論のユニットテストとパフォーマンスベンチマークを生成して」と依頼すると、テストコードも自動で作成されます。

// ImageClassifierTests.swift
// 推論精度とレイテンシのベンチマークテスト
import XCTest
@testable import MyApp
 
class ImageClassifierTests: XCTestCase {
    var classifier: ImageClassifierService!
 
    override func setUpWithError() throws {
        classifier = try ImageClassifierService()
    }
 
    func testClassificationAccuracy() async throws {
        let testImage = loadTestImage("golden_retriever.jpg")
        let results = try await classifier.classify(image: testImage)
 
        XCTAssertFalse(results.isEmpty, "分類結果が空です")
        XCTAssertEqual(results[0].label, "golden_retriever")
        XCTAssertGreaterThan(results[0].confidence, 0.8)
    }
 
    func testInferenceLatency() async throws {
        let testImage = loadTestImage("sample.jpg")
 
        // 10回実行して平均レイテンシを計測
        let start = CFAbsoluteTimeGetCurrent()
        for _ in 0..<10 {
            _ = try await classifier.classify(image: testImage)
        }
        let elapsed = (CFAbsoluteTimeGetCurrent() - start) / 10
 
        // Neural Engine 使用時は 20ms 以下を期待
        print("平均推論時間: \(elapsed * 1000)ms")
        XCTAssertLessThan(elapsed, 0.1, "推論時間が100msを超えています")
    }
 
    // 期待する出力:
    // 平均推論時間: 12.3ms(iPhone 15 Pro, Neural Engine使用時)
}

まとめ

Edge AI はモバイルアプリ開発の新たな標準になりつつあります。Core ML と TensorFlow Lite を使ったオンデバイスAI推論は、レイテンシの削減、プライバシーの保護、オフライン対応という3つの大きなメリットをもたらします。

Antigravity のAIエージェント機能を活用すれば、モデル変換スクリプト、推論コード、テストコードの生成を効率化でき、開発期間を大幅に短縮できます。まずは既存のモデルをCore MLまたはTFLite形式に変換し、小さなプロトタイプから始めてみてください。

さらに実践的なモバイル開発テクニックについては、Antigravity × Flutter モバイル開発完全ガイドやAntigravity × Xcode 26 / iOS 26 開発ガイドも参考にしてください。

シェア

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

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

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

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

アプリ開発2026-04-25
Gemma 4 × Antigravity — iOS・Android 両対応オンデバイスAI 実装ガイド
Gemma 4 モデルを iOS(Core ML)と Android(TensorFlow Lite / AI Core)の両プラットフォームに本番統合する手順を、Antigravity で AI 支援しながら詳解。モデル変換・量子化・審査対策まで。
アプリ開発2026-07-18
「Compose ファースト」の後で、View の画面をどの順に移すか — 画面数ではなく変更頻度で決める
Google が Android 開発を Compose ファーストと表明しました。View ベースの画面をどの順で移すかを、画面数ではなく git の変更履歴から決める判断軸と、実際に動かしたスコアリングスクリプトをまとめます。
アプリ開発2026-07-13
画像の一括最適化をエージェントに任せる前に置く、見た目の劣化を止めるゲート
壁紙アプリの数百枚のアセットをエージェントに一括再エンコードさせたら、数枚だけ色がくすんでいました。サイズ削減率だけでは劣化を見抜けません。SSIM・ΔE・ファイルサイズの3軸でマージ前に不良変換を弾くゲートの設計と、Pillow と scikit-image で動く判定スクリプトをまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →