【0から学ぶAI】第234回:FlaskによるWebアプリケーション化 〜シンプルなWebアプリにモデルを組み込む方法を説明

目次

前回のおさらいと今回のテーマ

こんにちは!前回は、モデルのデプロイ方法として、Flaskを使ったシンプルなWeb APIの構築方法を学びました。APIを使うことで、学習済みモデルをリアルタイムに利用可能なサービスとして提供できることが分かりましたね。

今回は、さらに一歩進めて、Flaskを使ってWebアプリケーションにモデルを組み込む方法を解説します。APIの形でモデルをデプロイするだけでなく、Webアプリケーションのインターフェースを通じてユーザーがモデルにアクセスし、インタラクティブに予測結果を確認できるようにします。これにより、実際のアプリケーションで機械学習モデルを活用する方法が具体的に理解できます。それでは、Flaskを使ったシンプルなWebアプリケーションの実装に取り組んでいきましょう。

Flaskとは?

Flaskは、PythonでWebアプリケーションやAPIを構築するための軽量なフレームワークです。Flaskはシンプルで柔軟性があり、小規模なアプリケーションからAPIの開発まで幅広く利用されています。

Flaskの主な特徴は以下の通りです。

  1. シンプルで軽量: 必要最低限の機能のみを備えており、学習コストが低い。
  2. 柔軟性: プラグインや拡張を通じて、自分に合ったWebアプリケーションを構築できる。
  3. 高速な開発: 簡単な構造で、迅速にプロトタイプやアプリケーションを開発できる。

シンプルなWebアプリケーションの設計

まずは、Flaskを使ってシンプルなWebアプリケーションを設計し、その中にモデルを組み込む流れを説明します。今回作成するWebアプリケーションでは、以下の機能を実装します。

  • ユーザーがフォームにデータを入力できるインターフェース
  • 入力されたデータを受け取り、学習済みモデルで予測を行う処理
  • 予測結果をWebページに表示

このようにして、モデルをWebアプリケーション内で利用することで、ユーザーがインタラクティブに予測機能を使えるようにします。

必要なライブラリのインストール

まず、FlaskとTensorFlow(またはKeras)をインストールします。これにより、Webアプリケーションの構築と学習済みモデルの読み込みが可能になります。

pip install flask tensorflow

学習済みモデルの準備

まず、簡単なモデルを作成し、保存しておきます。以下は、数字を分類するシンプルなモデルの例です。

import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np

# モデルの定義
model = models.Sequential([
    layers.Dense(128, activation='relu', input_shape=(4,)),  # 入力は4つの特徴量
    layers.Dense(64, activation='relu'),
    layers.Dense(3, activation='softmax')  # 3クラス分類
])

# モデルのコンパイル
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# ダミーデータで訓練
x_train = np.random.rand(100, 4)
y_train = np.random.randint(3, size=100)
model.fit(x_train, y_train, epochs=10)

# モデルの保存
model.save('simple_model.h5')
  • model.save(‘simple_model.h5’): モデルをファイルに保存します。このファイルをWebアプリケーションで読み込み、予測に利用します。

Flaskアプリケーションの作成

次に、Flaskアプリケーションを作成し、保存したモデルを読み込んでWebアプリケーション内で使用できるようにします。

1. Flaskアプリケーションの初期設定

まず、app.pyというファイルを作成し、以下のコードを書きます。

from flask import Flask, render_template, request
import tensorflow as tf
import numpy as np

# Flaskアプリケーションの初期化
app = Flask(__name__)

# 学習済みモデルの読み込み
model = tf.keras.models.load_model('simple_model.h5')

# ホームページのルーティング
@app.route('/')
def home():
    return render_template('index.html')

# 予測用のルーティング
@app.route('/predict', methods=['POST'])
def predict():
    # フォームからのデータを取得
    input_data = [float(request.form['feature1']),
                  float(request.form['feature2']),
                  float(request.form['feature3']),
                  float(request.form['feature4'])]

    # 入力データをモデルに与えて予測
    prediction = model.predict(np.array([input_data]))
    predicted_class = np.argmax(prediction)

    # 結果を表示
    return render_template('result.html', prediction=predicted_class)

# アプリケーションの実行
if __name__ == '__main__':
    app.run(debug=True)

2. テンプレートファイルの作成

Flaskでは、HTMLテンプレートを使ってWebページを生成します。テンプレートファイルは、templatesというフォルダに保存します。

(1) index.html(入力フォーム)

templates/index.htmlを作成し、以下の内容を記述します。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Simple Flask App</title>
</head>
<body>
    <h1>データを入力してください</h1>
    <form action="/predict" method="POST">
        <label for="feature1">特徴量1:</label>
        <input type="text" id="feature1" name="feature1"><br><br>
        <label for="feature2">特徴量2:</label>
        <input type="text" id="feature2" name="feature2"><br><br>
        <label for="feature3">特徴量3:</label>
        <input type="text" id="feature3" name="feature3"><br><br>
        <label for="feature4">特徴量4:</label>
        <input type="text" id="feature4" name="feature4"><br><br>
        <input type="submit" value="予測">
    </form>
</body>
</html>

このフォームでは、ユーザーが4つの特徴量を入力し、/predictエンドポイントにPOSTリクエストを送信します。

(2) result.html(予測結果の表示)

次に、templates/result.htmlを作成し、予測結果を表示するページを設定します。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Prediction Result</title>
</head>
<body>
    <h1>予測結果</h1>
    <p>予測されたクラス: {{ prediction }}</p>
    <a href="/">戻る</a>
</body>
</html>

{{ prediction }}の部分には、Flaskから送られてきた予測結果が表示されます。

3. アプリケーションの実行

すべてのファイルが準備できたら、ターミナルでapp.pyを実行します。

python app.py

ブラウザでhttp://127.0.0.1:5000にアクセスすると、Webアプリケーションが表示され、データを入力して予測結果を確認できます。

Flaskアプリケーションのデプロイにおけるベストプラクティス

  1. セキュリティの強化: ユーザーが入力するデータに対してバリデーションを行い、SQLインジェクションやXSS攻撃などの脅威からアプリケーションを保護します。
  2. スケーラビリティの考慮: アプリケーションを本番環境にデプロイする際は、NginxやGunicornなどのWSGIサーバーを使用して、パフォーマンスとスケーラビリティを向上させます。
  3. クラウド環境での運用: AWS、

Heroku、GCPなどのクラウドプラットフォームを利用することで、アプリケーションをスケーラブルかつ信頼性の高い環境で運用できます。

まとめ

今回は、Flaskを使ったWebアプリケーション化として、シンプルなWebアプリに機械学習モデルを組み込む方法を解説しました。Flaskを利用することで、ユーザーがインタラクティブにモデルを使い、リアルタイムで予測結果を確認できるアプリケーションを迅速に構築できます。今後、さらに複雑なアプリケーションやAPIを構築する際の基礎として、ぜひ活用してください。

次回予告

次回は、APIの作成と公開として、モデルをAPIとして提供する方法を解説します。実際にAPIを作成し、公開するまでの流れを学びましょう!


注釈

  • Flask: Pythonの軽量なWebフレームワークで、APIやWebアプリケーションの構築に広く使われている。
  • テンプレートエンジン: Flaskでは、Jinja2というテンプレートエンジンを使ってHTMLテンプレート内にPythonの変数やロジックを埋め込むことが可能。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社PROMPTは生成AIに関する様々な情報を発信しています。
記事にしてほしいテーマや調べてほしいテーマがあればお問合せフォームからご連絡ください。
---
PROMPT Inc. provides a variety of information related to generative AI.
If there is a topic you would like us to write an article about or research, please contact us using the inquiry form.

コメント

コメントする

目次