PiCar-V Self-drivingの学習をしてみました
久々に畳み込みニューラルネットワークを使いました
今回のSelf-drivingはPiCar-Vに搭載しているカメラの画像から速度、ステアリング角度を決めPiCar-Vを走らせるものです。
そのために、走行時に蓄積した3000枚を超える数の画像を使って学習をします。
学習には、画像の学習に適している畳み込みニューラルネットワークを使ったディープラーニングを使います。
畳み込みニューラルネットワークに関しては下の記事に判り易く書かれていますのでご参考。
そしてコレ。
畳み込みニューラルネットワークとは、人間の視覚をモデルにしたもので、簡単に言えば、ある特定の形状に反応する単純型細胞を模した畳み込み層と、単純型細胞を連携することで空間的な位置ずれを吸収する複雑型細胞を模したプーリング層を組み合わせたものです。
人間を含め動植物は上手くできているなと感心するばかりです。
引用:iMagagine
それでは準備をしましょう
ニューラルネットワークで学習を行うためのライブラリーとしては将棋AIのためのディープラーニングを構築した時に使用したChainerを使います。
余談ですがChainerは日本人が開発したものですが、今は開発は終了しています。
本当に残念です。
また、画像処理、画像解析のためのライブラリとしてOpenCVを使用します。
OpenCVとそれに必要なモジュールのインストールの仕方は下の記事に書かれています。
ご参考
どの畳み込みニューラルネットワーク(CNN)を使いましょうか
畳み込みニューラルネットワークを使うと決めましたが、どのネットワークを使いましょうか。
僕が使っているWindowsマシンはGPUが載っていないのでCPUでの計算になります。
(MacにはGPUが載っていますがAMD製なのでNVIDIAソフトが使えないんですよね)
今回は、PiCar-Vの速度やステアリング角度のデータの種類が少ない(速度は0以外は1種類、角度は45度ピッチ)ので他のCNNに比べて構造がシンプルであり手書き数字の認識で99.3%と高い精度を実現したLeNetを使おうと思います。
LeNetによるモデルのコードは以下のようなものです。
モデルのコード、学習のコードもgithubに掲載可能になった段階で投稿します。
学習結果はコチラ
学習の条件は以下
使用したパソコン:Surface Laptop2 (Core i5-7200U CPU@2.50GHz 2.71GHz RAM 8GB)
GPU:無し
Python環境:Anaconda Navigater
データセット:3455件
バッチサイズ:1000
エポック数:500
そして学習結果は以下
学習時間は、GPUが無くCPUで学習を行なったので3時間30分かかりました。
学習開始の画面、途中の画面、学習を終了し、学習モデルを検証した結果の画面を下に添付します。
開始時の画面です。
速度、ステアリング角度のLossは共に大きな値です。
学習途中の画面です。
速度Loss、ステアリング角度Loss共に順調に低下していっています。
学習が終わり検証を行った結果です。
左側に学習モデルを使って算出した速度、ステアリング角度を示しています。
右側のファイル名にある速度、ステアリング角度と比べると、学習モデルがそこそこ悪くない結果を出していることが判ります。
これは期待できそうです。
今日はここまでです。
次は、今回作成した学習モデルを使ってPiCar-VのSelf-drivingをやってみます。
では、また。