TensorFlow LiteでResNet-50を活用する方法とデータセットの必要性

# チーム開発でトレーニング済みモデルを活用して悟った『無知の知』

初めまして。チーム開発でトレーニング済みモデルを使用したAndroidアプリを開発していたところ、トレーニングモデルを根本的に理解していなかった者です。
つまり、『無知の知』を悟ってしまいました。
なので、アウトプットもかねての投稿になります！


## 1. まずResNet-50って？
ResNet-50は、**Residual Network**（残差ネットワーク）の一種で、50層から構成される深層学習モデルです。主に画像認識や分類のタスクで使用され、高い精度を誇ります。

ResNetの特徴は「スキップコネクション（ショートカット接続）」と呼ばれる手法を採用しており、これにより非常に深いネットワークでも効率的に学習を行うことができます。ResNet-50は、ImageNetなどの大規模なデータセットで学習されており、汎用的な画像認識タスクで広く利用されています。

## 2. TensorFlow Lite（.tflite）とは？
TensorFlow Liteは、Googleが提供する機械学習フレームワークであるTensorFlowの軽量版です。特に、モバイルデバイスや組み込みシステムなど、計算リソースやメモリが限られた環境での機械学習モデルの実行を目的としています。.tfliteは、TensorFlow Lite用に最適化されたモデルのファイル形式で、モデルのサイズを小さくし、実行速度を向上させるためのさまざまな最適化が施されています。

## 3. resnet50 model.tfliteの概要

**resnet50 model.tflit**は、ResNet-50モデルをTensorFlow Lite形式に変換したファイルです。この変換により、ResNet-50の強力な画像認識能力を、スマートフォンやIoTデバイスなどのエッジデバイス上で効率的に利用できるようになります。具体的な用途としては：

* モバイルアプリケーション：画像認識や分類機能をアプリ内で実行できる
* 組み込みシステム：監視カメラや自動運転車など、リアルタイムでの画像処理が必要なデバイス
* エッジコンピューティング：クラウドに依存せずにデバイス側で機械学習推論を実行することで、遅延を低減し、プライバシーを向上

## 4. データセットは必要か？ 推論と再学習の場合
**4.1 推論（Inference）としての利用**

**推論**とは、既に学習済みのモデルを使用して新しいデータに対して予測や分類を行うことです。resnet50 model.tfliteを推論目的で使用する場合、以下の点に注意が必要です。

* 元のトレーニングデータセットは不要：
モデルは既に大規模なデータセット（例：ImageNet）で学習されているため、再度データセットを用意する必要なし

* 必要なもの：
入力データ：実際に分類や予測を行いたい画像データ。これはプロジェクト独自のデータであり、ユーザーが提供する画像やリアルタイムで取得されるデータ（カメラ映像など）になります。

**4.2 モデルの再学習やファインチューニング（Fine-tuning）の場合**

**再学習やファインチューニング**とは、既存のトレーニング済みモデルを特定のタスクやドメインに適応させるために追加で学習を行うことです。

* 元のトレーニングデータセットは不要：

再学習には新たなカスタムデータセットが必要となります。これはプロジェクトの特定のニーズに合わせたデータです。
* 必要なもの：

1.新しいデータセット：特定のタスクに対応する画像データとそのラベル。例えば、医療画像診断用や特定の製品分類用など。
2.注意点： TensorFlow Lite形式（.tflite）は主に推論用に最適化されているため、再学習やファインチューニングには元のTensorFlowモデル（通常はSavedModel形式など）が必要です。再学習後、再度TensorFlow Lite形式に変換する必要があります。

# 5. Pythonで実践：ResNet-50をTFLiteで使用する

**5.1 必要なライブラリのインストール**
```py:bash
pip install tensorflow tensorflow-lite
```
**5.2 モデルのダウンロードと変換**

```py:python
import tensorflow as tf

# TensorFlowのResNet-50モデルをロード
model = tf.keras.applications.ResNet50(weights='imagenet')

# TensorFlow Lite Converterを使用してモデルを変換
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

# .tfliteファイルとして保存
with open('resnet50_model.tflite', 'wb') as f:
    f.write(tflite_model)
```

**5.3 TFLiteモデルを用いた推論**
```py:python
import tensorflow as tf
import numpy as np
from PIL import Image

# TFLiteモデルをロード
interpreter = tf.lite.Interpreter(model_path='resnet50_model.tflite')
interpreter.allocate_tensors()

# 入力および出力のテンソルを取得
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

# 画像を前処理
def preprocess_image(image_path):
    img = Image.open(image_path).resize((224, 224))
    img = np.array(img)
    if img.shape[-1] == 4:  # 透過PNGの場合
        img = img[..., :3]
    img = tf.keras.applications.resnet50.preprocess_input(img)
    img = np.expand_dims(img, axis=0).astype(np.float32)
    return img

# 推論を実行
def predict(image_path):
    input_data = preprocess_image(image_path)
    interpreter.set_tensor(input_details[0]['index'], input_data)
    interpreter.invoke()
    output_data = interpreter.get_tensor(output_details[0]['index'])
    predictions = tf.keras.applications.resnet50.decode_predictions(output_data, top=5)[0]
    return predictions

# 例：画像の分類結果を表示
image_path = 'path_to_your_image.jpg'
predictions = predict(image_path)
for pred in predictions:
    print(f"{pred[1]}: {pred[2]*100:.2f}%")
```

## 6. まとめ
今回は、トレーニング済みモデルについて触れてみました。
『無知の知』を悟った私はここからがスタートライン
ResnetにはResnet50だけでなくResnet101(層の数の違い)などもあります。
初めからアノテーションなどしてトレーニングするのは難しいと思うので、一度トレーニング済みモデルで開発をしてみて私と機械学習ライフを楽しみましょう！！