見出し画像

Python(Flask)を使ったAIアプリ「近鉄特急どれかな?」の開発記録 その2~ モデルの作成と訓練 (tensorflow) ~

AIアプリ「近鉄特急どれかな?」について

 AIアプリ「近鉄特急どれかな?」は、画像ファイルを読み込む、または画像のurlを指定すると、10種類の近鉄特急のうち、どれに似ているかを判別します。

  1.  12200系 スナックカー

  2.  12400系 サニーカー

  3.  20000系 楽

  4.  21000系 アーバンライナーplus

  5.  21020系 アーバンライナーnext

  6.  22000系 ACE(エー・シー・イー)

  7.  22600系 Ace(エース)

  8.  23000系 伊勢志摩ライナー

  9.  50000系 しまかぜ

  10.  80000系 ひのとり

Webアプリ「近鉄特急どれかな?」はこちら

Webアプリ「近鉄特急どれかな?」

アプリ開発の流れ

  1. テーマ決め

  2. モデル学習用データを収集(Webスクレイピング)

  3. 学習用データの前処理(データクレンジング)

  4. モデルの作成と訓練 (tensorflow) ←ココ

  5. 学習済みモデルの軽量化 (.h5から.tfliteへ変換)

  6. Flaskでアプリの作成(ローカル環境)

  7. 本番環境の作成と公開(Heroku)

ここでは4.モデルの作成と学習について紹介します。

1 ~ 3(その1)はこちら
5(その3)はこちら
6, 7(その4)はこちら

Webアプリ「近鉄特急どれかな?」はこちら

Python実行環境

Windows11のWSL2内や、Google Colaboratory ProでPythonを実行しました。

PC1: Dell xps 13 2-in-1

  • プロセッサ   Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz   1.50 GHz

PC2: Surfase Laptop Studio

  • プロセッサ 11th Gen Intel(R) Core(TM) i7-11370H @ 3.30GHz 3.30 GHz

PC1、PC2共通事項

  • 実装 RAM 32.0 GB

  • システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ

  • エディション  Windows 11 Pro
    バージョン   21H2

  • OS ビルド  22000.832

  • Ubuntuバージョン(WSL2): 22.04 LTS または 20.04 LTS

  • Pythonバージョン: 3.10.4

  • Pythonを編集、実行したエディター: Visual Studio Code

Python仮想環境について

ローカルPC (Wondiws 11 WSL2内のUbuntu)で開発を行うときは、作業ディレクトリ内に仮想環境を作成し、仮想環境内でスクリプトを実行しました。
ターミナルで作業ディレクトリに移動し、以下を実行すると仮想環境が作成されます。

python3 -m venv env
source ./env/bin/activate

仮想環境から抜けるには、以下のコードを実行します。

deactivate

Google Colaboratory

 Googleが提供するPythonを記述できるWebアプリケーションです。
基本的な機能は無料で使えます。より性能が良いPro、Pro+は有料です。

4.モデルの学習は、ローカルPCやGoogle Colaboratoryでは時間がかかりすぎたり、終わらなかったりしたため、より多くの試行錯誤ができるよう、最終的にGoogle Colaboratory Pro(有料)を利用しました。

VGG16を使った転移学習モデル

 Aidemyの講座、「男女識別(深層学習発展)」で学んだ手法を採用しました。CNN (Convolutional Neural Network、畳み込みニューラルネットワーク)のアルゴリズムを用いた事前学習済みのモデル(VGG16)に、別の新しいモデルを結合して学習を行う転移学習という手法です。
 いちからモデルを定義することも考えましたが、3.学習用データの前処理に時間を使いすぎたので、ここはサクッと終わらせたいと思い、転移学習一択でいくことにしました。

モデルSummary

モデルの訓練時に工夫した点

今回、自分なりに工夫した点は次のとおりです。

  • 学習につかうデータの数をすべてのラベルで同じになるように揃えた

  • 各パラメータを変化させて検討するために繰り返し処理を行った

  • 考察をしやすくするため、学習済みモデルの精度や学習に使用したデータのリストをcsvで保存した

  • 学習用データが重すぎてエラーが出たため、訓練データの読み込みにジェネレータを利用することでエラーを回避した

画像の前処理 (OpenCV)

 ライブラリOpenCVを使って画像の前処理をしました。予め前処理済みの画像を準備しておいたほうが、訓練時の負荷は減りますが、画像サイズも検討パラメータの一つだったため、訓練時に毎回前処理を行いました。
 元画像を読み込み、正方形に加工した後(元画像のアスペクト比を固定、長いほうの辺の正方形とし、余白は黒とした)、訓練時のサイズにリサイズしました。

OpenCVを用いた画像の前処理
画像の前処理

モデル訓練における検討内容と訓練結果

 画像サイズ、Dense層の入力ユニット数、エポック数、バッチサイズ等のパラメータを変化させて検討しました。メモリの関係か、パラメータのサイズによってはエラーが出て実行できませんでした。
 ラベル6種類から始め、いろいろ検討した後、最終的に10種類まで増やして再度検討を重ねました。
1ラベル当たり300枚の画像を学習に使用し、8割を訓練用、2割を検証用データとしました。ラベルの種類で画像の枚数が異ならないように、300枚に満たない種類のものは、ライブラリimbalanced-learnを利用し、予め水増しをして300枚に揃えました。
画像サイズは100 x 100から500 x 500まで100きざみで検討しました。
100や200では精度が上がらず、300, 400, 500はほぼ同等の精度でした。
最終的に、次のパラメータで最高精度(0.913)が得られました。

  • Dense層入力ユニット数: 1024

  • 画像サイズ: 300 x 300

  • エポック数: 8

  • バッチサイズ: 64

モデル(.h5ファイル)のファイルサイズは390 MBでした。。。

モデルの作成と学習で作成したPythonスクリプト

Google Colaboratoryを使う場合

 Google Colaboratoryを利用した場合には、解析結果を保存などのために、Google Driveをマウントしました。

from google.colab import drive
drive.mount('/content/drive')

パスを通します。

import sys
import os

sys.path.append('/content/drive/My Drive/Colab Notebooks/train_app/scripts')

作業フォルダに移動しておきます。

os.chdir("/content/drive/My Drive/Colab Notebooks/train_app/scripts")

Pythonスクリプト: モデルの訓練と推測、各結果の保存

 モデルの訓練と学習済みモデルの推測、各結果の保存に使用したスクリプトです。

冗長な部分も多々あると思いますがご容赦ください。。。
もっとスマートな書き方をご存じの方は、ぜひアドバイスをいただけるとうれしいです。

その3につづきます

余談

 モデルの訓練のため、オーバーナイトでPC (Dell xps)を動かしていたところ、ぶっこわれました。。。なんかガリガリと異音がするぞ、ヒェー!と思っていたら、静かになってホッ。しかし、再起動したタイミングでエラーが。。。
「ファンが応答していません」
静かになったのは回るのをやめたからだったか。。。
結局、修理に出すことになり、マザーボード交換して、まっさらになって返却されてきました。えぇっ、Windows 10になってる。。。一からセットアップやり直し(泣)
しかしSurface Laptop Studio、高かったけど思い切って買っといてヨカッタ。。。
2つのPCでモデルの訓練を行いましたが、CPUの性能の差を実感しました。
SurfaceのほうがDellより2倍ぐらい速かったです。

この記事が気に入ったらサポートをしてみませんか?