ゼロからはじめる機械学習「AutoMLを使ったオリジナル画像判定WEBサービスをつくろう」

## サンプルソースの公開場所
https://github.com/techgymjp/techgym_ai

実行環境がない場合はanaconda をinstall してください。
(抜粋版なので問題番号は連番ではないです)
## 解説動画
https://youtu.be/0ob4ZWEhZoo

## ■13-1：センサーデータ分析：eP4q.py
【問題】
センサーデータを分析することでIoT からくるデータ分析の方法を実践してみよう
気象庁から温度湿度データをオープンデータとして得ることが出来る
そこで、気象庁のセンサーデータで以下のことをやってみよう

□takamatsu.csv をgithub からダウンロードしてデータフレームで表示する
このとき以下の条件でファイルを読み込む
・”日時”を”data_hour”としてindex に指定する
・data_hour をdatetime 型として読み込む
・”×”のデータはNaN として読み込む
・「時」の列は使わないので削除する
□列の名前を英語に変更する
"降水量(mm)": "rain","気温(℃)": "temperature","湿度(％)": "humid"
□欠損値を0 にする
□'2012/07/01 00:00:00'を起点としての経過時間を計算して、time という列を追加する
まず、起点の時刻との差分としてdelta という変数つくる
このときtime の列は 次の値に設定する: delta.days + delta.seconds / 3600.0 / 24.0
□グラフを表示する
"降水量(mm)": "rain","気温(℃)": "temperature","湿度(％)": "humid"
■解答はsZ8c.py

## ■13-2：センサーデータ分析：q8Wh.py
【問題】
温湿度センサーデータの分析をする準備で、
電力消費量のオープンデータについて以下を実施してみよう
□shikoku_electricity_2012.csv をgithub からダウンロードしてデータフレームで表示する
このとき以下の条件でファイルを読み込む
・先頭3 行の読み込みをスキップする
・header としてnames=['DATE', 'TIME', 'consumption']を指定する
・['DATE', 'TIME']をdata_hour としてdatetime 型で読み込む
・”data_hour”をindex に指定する
□'2012/07/01 00:00:00'を起点としての経過時間を計算して、time という列を追加する
まず、起点の時刻との差分としてdelta という変数つくる
このときtime の列は 次の値に設定する: delta.days + delta.seconds / 3600.0 / 24.0
□電力消費量の時間変化の散布図を表示する(consumption とtime)
□電力消費量のヒストグラムを表示する(分割数を100 とする)
■解答はRe5V.py

## ■13-3：センサーデータ分析：Rf6G.py
【問題】
温湿度センサーデータから電力消費量を推定してみよう
□気象データと電力消費量データをいったん統合して時間軸を合わせたうえで、再度分割する
(ヒント：elec_data.join(tmp[["temperature","sunhour","month","hour"]]).dropna().values)
□SVM を用いて気温, 日照時間, 月, 時間から電力消費量を推定する
□訓練スコアと検証スコアを計算する
□推定した電力消費量から統計値を計算して、電力消費量についての施策を自由に考えてみよう

## ■13-17：CNN(モデル構造)：e5Us.py
【問題】
Keras を使用して簡単にモデルを作成することができるが、
各層の重みや層の構造を調べることも出来る
手書き文字データのモデルで層の重みを調べてみよう
□モデル構造を表示しよう(summary()を使用する)
□モデルの重みを表示しよう(weights 変数を使用する) → これにより各層の行列の大きさがわかる
□各レイヤーのweight とbias を取得する(get_weights()を使用する)
□取得したweight とbias の行列の大きさを表示して、もう一度、各層の行列の大きさを確認する
□具体的な重みとバイアスを表示してみる
■解答はE4rW.py

## ■13-20：画像分類：J6gF.py
【問題】
画像分類の問題に取り組んでみよう
□以下のURL に分類分けされた101 種類の写真があるのでファイルをDownload する
http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
画像データを読み込んで処理しやすいように変形して一度、保存をする
(このとき、学習データと訓練データに分けておく)
■解答はh8H9.py

## ■13-21：画像分類：y7FU.py
【問題】
□前問で保存したデータをロードする
□学習用のデータを正規化する（float 型へ変換して256 で除算する）
□以下の学習モデルを作成する
model = Sequential()
model.add(Convolution2D(32, 3, 3,
border_mode='same',
input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
□モデルを訓練する(batch_size=32, nb_epoch=50)、その後、モデルを評価する
■解答はV9j7.py

## ■13-23：移転学習(画像分類)：Ln7g.py
【問題】
大量のデータで画像分類をするときは学習のコストが大きくなる。そこで、すでに学習済みの重みを使って
画像分類をすると効率的に処理が出来る。さらに、keras には学習済みのモデルがすでに用意されている。
また、用途に応じて学習済みの重みの一部を変更することも出来る。
□カテゴリーが記述されたJSON ファイルをDownload する
□分類対象となる画像をDownload する
□配列の形状を(1, Height, Width, Channels)という形に変形する
□画像を予測して、予測した名前を表示する
どの程度一致していたかを推論してTOP5 に一致する名前を出力する
(分類名は英語になっているので、わかりやすいように日本語化している)
□自分の好きな画像をWEB から持ってきて何に分類されるかを試してみよう
今回はMobileNetV2 というモデルを使用した
■解答はHt2r.py

## ■13-24：移転学習(画像分類)：V5sd.py
VGG16 を用いて同じ画像を分類してみよう
※VGG16 は2014 年のILSVRC（ImageNet Large Scale Visual Recognition Challenge）で
提案された畳み込み13 層とフル結合3 層の計16 層から成る畳み込みニューラルネットワーク
■解答はA4f8.py

## ■13-25：動画物体認識：B8df.py

### 以降の問題で使用する仮想環境を構築する
□python3.8 系と必要なライブラリをインストールする
$ conda create -n yolov5 python=3.8
$ conda activate yolov5
$ git clone https://github.com/ultralytics/yolov5.git
$ cd yolov5
$ pip install -U -r requirements.txt
$ pip install pyqt5
$ pip install opencv-python-headless

### 【問題】動画物体認識をするための準備をする
(Github にある動画を再生する)
再生する動画ファイル名は” Dogs10820.mp4”
□動画が再生できることを確認する
■解答はkJ9R.py

## ■13-26：画像物体認識：Yr6M.py
### 【問題】YOLO(You Only Look Once)で物体認識をやってみよう。
YOLO は画像認識アルゴリズムであり、リアルタイムかつ高精度に処理が可能なものである。
これまでのアルゴリズムでは境界設定と物体検出という二段階で行われていた処理を一度に行うことによって高速に処理出来るようにしたものである。

□以下を実行してインストールが完了しているかを確認する
import torch
from IPython.display import Image, clear_output # to display images
clear_output()
print('Setup complete. Using torch %s %s' % (torch.__version__,
torch.cuda.get_device_properties(0) if torch.cuda.is_available() else 'CPU'))
□写真に映し出されている物体が何であるかの認識を実行してみる
(実行結果はruns/detect/以下に格納されている)
$ cd yolov5
$ python detect.py --weights yolov5s.pt --img 640 --conf 0.25 --source data/images/
■解答はmA37.py

## ■13-27：動画物体認識：Q4rA.py
【問題】
動画に映し出されている物体が何であるかの認識を実行してみる
動画ファイルはgithub にある以下の3 つのファイルとする
(Dogs10820.mp4 , Horse_44738.mp4 , Summer_24541.mp4)
$python detect.py --source ./Dogs10820.mp4
$python detect.py --source ./Horse_44738.mp4
$python detect.py --source ./Summer_24541.mp4

□認識した物体の名前と枠が上書きされた動画が生成されるので動画プレイヤーで再生してみる
(実行結果はruns/detect/以下に格納されている)
■解答はj6Gu.py (動画：Dogs10820_A.mp4 , Horse_44738_A.mp4 , Summer_24541_A.mp4)

## テックジムのAIエンジニア養成コース
https://techgym.jp/about/machine_learning_course/