猿でもわかるAIプログラミングシリーズ 🐵💻 スマホで動く！簡単AIアプリを作ってみよう（Kivy入門）

 


## 🧩 はじめに：なぜ「スマホで動くAIアプリ」なのか？

近年、AIはクラウドだけでなく、エッジやスマートフォンなど多様な環境で動かすニーズが高まっています。

* オフラインでの推論
* リアルタイムな処理
* スマートデバイスとの統合

こうした理由から「スマホ上でAIを動かす」ことは、もはや実験レベルではなく、**実務で必要なスキル**となりつつあります。

そこで今回は、Pythonでクロスプラットフォームのアプリ開発ができる**Kivy**と、画像分類モデル（MobileNet）を組み合わせ、**スマホで動く簡単なAIアプリ**を一緒に作ってみましょう！

---

## 🔍 Kivyとは？ざっくり概要

### ✔ 特徴

* **Python製のUIフレームワーク**
* **iOS / Android / Windows / macOS / Linux** に対応
* **シンプルなコード構造と高速な開発**

### ✔ こんなときに便利

* モバイルアプリのプロトタイピング
* ハードウェアとの連携アプリ（IoT含む）
* 軽量なAI GUIツールの作成

> KivyはHTMLやJS不要で、Pythonベースで完結する点が最大の魅力です。

---

## 🛠 スマホで動く画像分類AIアプリを作ってみよう！

### 💡 目標

カメラで撮った画像をもとに、**MobileNetでリアルタイム分類**するシンプルなアプリを作成します。

---

### ① 開発環境準備

```bash
pip install kivy
pip install tensorflow
pip install opencv-python
```

※ スマホへのデプロイには [Buildozer](https://github.com/kivy/buildozer) や [Kivy-ios](https://github.com/kivy/kivy-ios) を利用します（後述）

---

### ② コード実装（最小構成）

#### `main.py`

```python
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
from kivy.graphics.texture import Texture
import cv2
import tensorflow as tf
import numpy as np

class MainLayout(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.capture = cv2.VideoCapture(0)
        self.model = tf.keras.applications.MobileNetV2(weights='imagenet')
        self.image = self.ids['cam_view']
        self.update()

    def update(self, *args):
        ret, frame = self.capture.read()
        if ret:
            buf = cv2.flip(frame, 0).tostring()
            texture = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt='bgr')
            texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte')
            self.image.texture = texture

        self.predict(frame)
        self.image.canvas.ask_update()
        self.image.texture = texture
        self.image.texture_size = texture.size
        App.get_running_app().root_window.canvas.ask_update()

    def predict(self, frame):
        resized = cv2.resize(frame, (224, 224))
        img_array = tf.keras.applications.mobilenet_v2.preprocess_input(np.expand_dims(resized, axis=0))
        prediction = self.model.predict(img_array)
        label = tf.keras.applications.mobilenet_v2.decode_predictions(prediction, top=1)[0][0][1]
        print(f"予測結果: {label}")

class AIApp(App):
    def build(self):
        return MainLayout()

if __name__ == '__main__':
    AIApp().run()
```

#### `main.kv`

```kv
<MainLayout>:
    orientation: 'vertical'
    Image:
        id: cam_view
```

> これでPC上ではリアルタイムで画像分類が実行されるようになります。

---

### ③ スマホ向けにデプロイ

#### Androidの場合（Buildozer）

```bash
sudo apt install -y buildozer
buildozer init
buildozer -v android debug
buildozer android deploy run
```

#### iOSの場合（Mac必須）

```bash
brew install kivy-ios
toolchain create aiapp main.py
toolchain build aiapp
```

> デプロイに関しては公式ドキュメントの参照をおすすめします。

---

## 🧑‍💻 実務Tips：よくある落とし穴と対策

### ❌ TensorFlowが重すぎる問題

→ 対処法：

* TensorFlow Lite を使用
* 学習済みモデルを `.tflite` 形式に変換（`tf.lite.TFLiteConverter`）

### ❌ カメラ認識が不安定

→ 対処法：

* OpenCVの代わりに Kivyの`Camera` widget を使うと安定することもある

### ❌ スマホでクラッシュ

→ 原因：依存関係の記述ミス（`buildozer.spec` の `requirements` を正確に記載）

---

## 🚀 応用アイデア：できることは無限大！

### 🔎 OCRアプリ

画像内の文字認識にTesseractやGoogle OCRを組み合わせる

### 🐶 ペット判定アプリ

画像分類で「犬」「猫」などのペットを判別

### 🤖 オフライン音声認識アプリ

Vosk + Kivyを組み合わせて音声コマンド対応アプリを開発

---

## ✅ まとめ：Kivy × AI = 強力な武器

| 項目       | 内容                             |
| -------- | ------------------------------ |
| ✅ メリット   | Pythonで完結、マルチプラットフォーム対応、素早く試せる |
| ⚠️ デメリット | ネイティブUIに劣る、iOS周りはやや複雑          |
| 🌟 将来性   | 軽量AI + エッジ環境のニーズが拡大中！          |

---

## 🎯 最後に一言

KivyとAIの組み合わせは、**アイデア次第で無限の可能性**があります。
まずは簡単な分類アプリから始めて、自分だけのAIモバイルアプリを作ってみてください。

次回は「📸 画像分類モデルをTFLiteで軽量化する方法」について詳しく解説します！

---

🧑‍🔬 **筆者紹介：**
クラウド × AIに精通したフルスタックエンジニア。現場で役立つ技術の「使いどころ」と「落とし穴」を発信中。
フォロー & LGTM していただけると励みになります 🙌