RCJレスキューメイズでの機械学習についての知恵袋

# はじめに
この記事では私が思う、メイズの文字認識に有用な機械学習の手法について書いていきます。メイズで機械学習を使おうと思った時や、精度向上のために何をすればいいかわからないという人は見ていってください。
機械学習とは何かなどについては解説しませんのでご了承ください。代わりと言っては何ですが学習におすすめのサイトや書籍の紹介を記事の最後でしています。

:::note warn
注意
この先、具体的なコード例などはありません。また、あくまで個人の考え方や意見なのであまり鵜呑みにはしないようお願いします。
:::

# 転移学習
メイズの文字認識は例え３クラスの分類といえど、一からモデルを学習させて精度を出すのはなかなか難しいものです。
そこで、私がおすすめするのは転移学習というものです。

転移学習とは、あるタスクで高い性能を示す学習済みのモデルの知識を類似のタスクに転送して再利用、応用するという機械学習の手法です。
同じようなタスクであるなら処理の方法や認識の基準などは類似するはずですよね。であれば知識を流用することで、別の問題を一から解く手間を省略できるはずだとしているのが転移学習です。

実際に転移学習は一から学習させる時と比べて学習コストが低く精度も高くなることがほとんどです。そのためメイズの文字認識で機械学習を用いる場合、私は転移学習させることを強くおすすめします。

# 過学習の防止
機械学習ベースの文字認識において、一番気をつけるべきものは過学習でしょう。
過学習とは何か簡単に説明すると、学習データに特化しすぎて未知のデータに対して汎化能力が低くなる現象の事です。
これはさまざまな原因で起こり得ます。そこで私がおすすめする対策についていくつか紹介します。

## 学習用データの前処理
一つ目は学習データの前処理です。
具体的にはデータの間引きとデータの拡張、変換を行います。一つずつ見ていきましょう。
まず、データの間引きは学習に使うデータに同じようなものが大量に存在する場合に有効となってきます。間引きによって実質的に学習データのバリエーションを増やすことができ汎化性能の低下を防ぐことができます。やり過ぎには注意しましょう。
次に、データの拡張、変換は基本どのような場合でも有効になってきます。具体的には、学習に使う画像を左右反転させたり、回転させたり、画像の明度を調整します。これによりデータのバリエーションが増え過学習の防止につながります。

## コールバック関数の有効活用
二つ目はコールバック関数の有効活用です。
多分どういうこっちゃという風になっていると思うので具体的に使い方や効果を見ていきましょう。ここでは例としてTensorflowを使います。
###### 学習の早期終了
``` keras.callbacks.EarlyStopping() ```
これは一つ前のエポックと今回の検証用データでの精度や損失などを比べ明らかに悪化している場合、そこで学習の早期終了させるというものです。これにより過学習を未然に防ぐことができます。
###### Tensorboardで監視
``` keras.callbacks.TensorBoard() ```
これはTensorboardという学習の様子を確認することができるツールを使うためのものです。Tensorboardで精度や損失の推移を観測してそもそもちゃんと学習がうまくいってるか、過学習していないかなどの確認ができます。
過学習が起きているのは、訓練データでの精度は上がっているのに検証用データでの精度が下がっている、訓練データでの損失は下がっているのに検証用データでの損失は上がっているような時です。実際に精度と損失の推移を示したグラフを以下に示すので、実際にどこら辺で過学習になりかけているのか考えてみましょう。
↓精度の推移(オレンジが訓練データ,青が検証用データ)
![epoch_accuracy (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708135/4a64df1a-32bb-3324-709e-16181483e640.png)
↓損失の推移(オレンジが訓練データ,青が検証用データ)
![epoch_loss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708135/f34f81d3-043d-af7f-1c87-e3c38302b708.png)



# 学習データの集め方
学習データを集める際に気をつけるべきことは、実際に使うカメラでデータを集める、というものです。完全に二値化して用いるならいいですがそうでないならカメラごとにある癖(白飛びしやすかったり、画面全体が少し赤みがかってたりなど)や広角レンズなら曲率による特有の写り方があるのでスマホで撮ってそれを学習データに使う〜というのは避けることをおすすめします。(学習データに数枚紛れ込ませるなら別ですが)

# コードとデータセット
これが実際に2022年の全国大会で使ったデータセットとモデルを組むためのコードです。

https://github.com/marshallow1192/Image-Recognition-in-robocup-2022

必要ライブラリを入れるだけで、動かすことができるので自由に使ってもらって構いません。このコードでわからないところやメイズの被災者発見についても聞きたいことがあれば遠慮なく~~Twitter~~ XのDMで聞いてください。

# 終わりに
この記事と一つ前の記事で私がRCJレスキューメイズについて伝えたいことはあらかた話したつもりです。これらがレスキューメイズに挑戦するロボカッパーの方々の力になれば幸いです。
ここまで読んでいただきありがとうございました。



# おすすめのサイトと書籍
### ゼロから作るDeep Learning
Deep Learningについてめちゃわかりやすく書かれているのでおすすめ。ただし少々線形代数の知識が必要な部分があるのでそこは注意。

https://www.oreilly.co.jp/books/9784873117584/

### Tensorflowのチュートリアル
実際に動かしてみるのが一番なのでおすすめ。元々英語のサイトを日本語に翻訳されているので若干日本語がわかりにくいところがあるのが気になるけどそれ以外は結構いい。転移学習のことも書かれているのでもし機械学習使いたいと思う人は画像関係の部分だけでもいいのでやってみるのをおすすめします(無料やしね)。ただし、ニューラルネットワークが内部でどんな風にして動いてるのかとかは載ってないので注意。

https://www.tensorflow.org/tutorials/quickstart/beginner?hl=ja

### python N年生シリーズ
プログラミング初心者におすすめだしディープラーニングのことも詳しく載っているのもあるので機械学習について勉強したい人にもおすすめできる本。

https://www.shoeisha.co.jp/book/detail/9784798153193

https://www.shoeisha.co.jp/book/detail/9784798180182

### 分析モデル入門
機械学習について幅広く、わかりやすく解説されているので読んでて楽しい本。ただし、実装コードとかは全くないしRCJで機械学習を使うだけの人には後ろ半分は必要ないと思うので注意。RCJでAIを使って、興味を持ち始めたら人には是非買ってみるのをおすすめする。

https://www.socym.co.jp/book/1377

### ヨビノリチャンネル
機械学習についてしっかり学ぶ際に必要となってくる線形代数の知識やニューラルネットワークの基礎知識についてわかりやすく解説されているので是非見て欲しい。(あと普通に普段の動画もめっちゃ面白いのでおすすめ。ファボゼロのボケが癖になるぜ！)

https://www.youtube.com/watch?v=xzzTYL90M8s

https://www.youtube.com/watch?v=7A05OamqCyc

https://www.youtube.com/watch?v=s5_Pk3CjhNA

https://www.youtube.com/watch?v=svm8hlhF8PA&list=PLDJfzGjtVLHnc1vTpBaCNKMUl6HauQv1a

https://www.youtube.com/@yobinori