はじめに
こんにちは、新卒1年目の三木です。
今回は、私がOJTの中で行った
「Deep Learningを利用した混雑レーダーの未来予測」
について紹介させていただきます。
「そもそも混雑レーダーってなに?」という方のために簡単にご紹介をすると、ヤフーが提供しているアプリの使用状況を元に、エリアにいる人数を推定し、ヒートマップとして地図上に投影したものです。以下の画像のように、混雑しているところが一目でわかります。
混雑レーダーへのリンク↓
https://map.yahoo.co.jp/maps?layer=crowd&v=3&lat=35.681277&lon=139.766266&z=15
今現在提供している混雑レーダーでは、現在時刻での混雑状況のみを提供しております。
ですが皆さん!!
今は混雑していないけど、これから混雑しそうな場所が知りたいと思いませんか??
混雑状況の未来がわかると、「今から混みそうだからやっぱり行くのやめよー」なんて判断もできますよね!
というわけで、今や当たり前の手法となりつつある「Deep Learning」を用いて未来予測ができないか試してみました。
PredNet
さて、今回混雑レーダーの予測のために使用したアルゴリズムは、「PredNet[1]」と呼ばれる手法です。PredNetは、coxlabにおいて開発されたもので以下のような特徴があります。
- Predictive Codingという脳機能を元に考案
- 教師なし学習
- 画像から直接画像を予測
- convLSTM[2]を内部で利用
Keras用のソースをcoxlabは提供しています↓
https://github.com/coxlab/prednet
上記リンクのリポジトリをcloneして利用が可能です。
$ git clone https://github.com/coxlab/prednet.git
Kerasのインストールは別途必要ですが、今回は説明を省略致します。
サンプルも含まれており、KITTIデータセットのドライブレコーダー画像に対して予測を行うサンプルを試すことができます。サンプルの実行方法は、リポジトリのREADME.mdに記述されていますので、参照しながらやってみてください!
結果画像の例[1]は以下です。上段が正解、下段が予測ですが良好な予測画像が得られています。
混雑レーダーの学習
サンプルではドライブレコーダー画像を使用していましたが、画像を混雑レーダー画像に差し替えて学習をしてみました。
実験環境は以下のとおりです。
- GPU:Tesla P40(24GB) x 2
- フレームワーク:Keras
- Backend:TensorFlow
- cuDNNを導入
結果画像としては以下のようになりまして、正解画像とのMSE(平均二乗誤差)は0.008858(画素値を0~1に正規化した時)です。色表現には乏しいですが、予測画像を出力することができました。
上段が正解で、下段が予測です。
しかしながら、正解画像の前フレームとのMSEを算出してみると0.006717でして、色表現に乏しい分悲しい結果に。。。
Residual PredNetの提案
そもそも前フレームとの差が小さい時系列画像だということがわかりました。
だとすれば、1から学習するよりも前フレームからの変化部分のみを学習するようにすると効率が良いのでは? と考えました。
例えばResNet[3]では、そのような機構をネットワークに組み込むことで精度向上を実現しています。
というわけで、やってみました!!
今回、PredNetに加えた変更は大きく2つあります。
- PredNetからの出力に入力を足し合わせたものを予測画像とする
- PredNetの出力に対して適用する活性化関数をReLUからtanhに変更
1つ目の変更によって、前フレームからの残差を学習する機構が出来上がります。2つ目の変更は、残差で正の数だけでなく負の数を扱えるようにするために行ったものです。オリジナルのPredNetでは活性化関数にReLUを採用しており、残差(±の符号を持つ)を学習する今回のネットワーク構造には適しません。なので、今回は負の数も扱えるtanhに変更した次第です。
以上の変更点をPredNetに加えた提案手法、Residual PredNetの構造を以下の図に示します。
また、入力画像にも変更を加えました。
先程の例では、RGBの3チャンネルを持つヒートマップ画像を入力として学習をしました。しかしながら、混雑度は元々1次元データなので3チャンネルで入力する必要はありません。
ですので、グレースケール画像を生成し直し、そちらを適用することにしました。
実際に生成したグレースケール画像は以下です。
予測結果
今回出力した予測画像に対して、MSEだけでなく他の指標も加えて評価をすることにしました。追加した指標は以下の3つです。
CSIはスレットレートとも呼ばれ、検索性能の評価で用いられるF値に似た指標です。FARは誤警報率を示し、この値が小さい程、混雑していない場所を混雑していると誤って予測することが少ないことを示します。PODは再現率を示し、混雑箇所を漏れなく予測できているかを示します。これらを混雑の閾値を変更しながら算出します。
まず、予測画像の例は以下です。東京駅周辺を切り取った画像で学習及びテストをしております。
前フレームでは混雑していなかった箇所が、次の時刻で混雑するという予測をしっかりできている箇所が見て取れます。
予測画像に対して各種指標を算出した結果が以下です。
混雑の閾値に関しては、閾値が小さくなるほど、混雑度の高い地域に限定して指標値を算出するという意味を示しております。
前フレームを単に予測とした場合と比較して、今回の手法で予測した画像が上回ったものがいくつか存在しました。混雑の閾値<105の時にMSEが上回っており、混雑度の高い場所の予測に関しては良好だと言うことを示しています。
また、今回の目的は
「混雑していなかった場所が近い将来混雑することを知りたい」
でしたよね。
そこで、前フレームから変化した部分に対するMSEを算出してみました。これによって、混雑度の変化をシステムが予測できているかを示すことができます。
変化部分に対するMSEは
ケース | MSE |
---|---|
前フレームを単に予測画像とした場合 | 0.000496077060234 |
本手法を用いて予測画像を生成した場合 | 0.000475558801554 |
となり、本手法の方がMSEが小さく、混雑変化を追えているということがわかりました。
おわりに
今回、PredNetに変更を加えて混雑レーダーの未来フレーム予測を行いました。従来であれば、各エリア毎のログを元にエリア毎の予測モデルを生成していたと思いますが、今回のように畳み込みを組み合わせた予測アルゴリズムを用いると画像から画像を直接予測することができます。
開発者の負担軽減及び工数削減にも繋がり、会社にとっても開発者にとっても嬉しいことですね! 画像予測等を行ってみたいなーと考えている方がいらっしゃいましたら、是非使用を検討してみてはいかがでしょうか?
また、新卒1年目でもこんなに面白いことを弊社ではできます! 就職先を迷っている学生さん、是非弊社に来て面白いことやってみませんか?
参考文献
- William Lotter, Gabriel Kreiman, David Cox,”Deep Predictive Coding Networks for Video Prediction and Unsupervised Learning”, arXiv:1605.08104, 2016.
- Xingjian Shi, Zhourong Chen, Hao Wang, Dit-Yan Yeung, Wai-kin Wong, Wang-chun Woo, “Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting”, arXiv:1506.04214,2015.
- Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun,”Deep Residual Learning for Image Recognition”, arXiv:1512.03385, 2015.
こちらの記事のご感想を聞かせください。
- 学びがある
- わかりやすい
- 新しい視点
ご感想ありがとうございました