アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

prednetで未来の画像予測、天気画像の予測コンペのログ【機械学習、python】

signateの雲画像予測コンペに初参加したので、そのログ。
個人の備忘録と技術メモのつもりで簡単にやったことつづってきます。

まず結果は17位。1位との精度差は10%くらいだった。初参加にしては上々なできかな。レベル高くて驚いた。

コンペのデータ構成

データは雲画像とmetaデータの2種類。metaデータは湿度、温度、風の向きとかの格子状の2次元データ(グレースケール画像)。


【データの特徴把握のため使った方法】

・月ごとの雲量をヒストグラムで可視化

・TSNEで雲量を分布を可視化

・類似画像検索でmetaデータと雲画像と相関関係の深いデータを調べた

・天気関係の本で気象庁がどうやって雲を予測しているかとか、雲の発生する流れの理解


metaデータの中で、湿度(RH)と風(VGRD)が雲画像と一番関係しているけど、活用方法が思いつかなったので保留した。

使うアルゴリズムは、動画のフレーム予測を予測するGAN系ネットワーク(VideoGAN, Recycle-GAN)とかを調べた中で、convLSTMの発展系のprednetが一番使えそうなので、改良して使用。

f:id:trafalbad:20191117144850j:plain



prednetを改良

以下の点でprednetを改良

・効率的に学習させるためgeneratorを改良

・prednet にresnetを追加することでextrapolationや精度をよくした。

・訓練回数を増やしてなるべく精度を上げた

・prednetの活性化関数のA_activation='relu'なのを、差分をとりたいなら"tanh"にすると有効だった。

・画像を簡単にするよりも、なるべく多くの画像群での一連の動作を何回も学習させた方が効果的。


resnetを入れて、時刻tの予測画像をt+1の予測画像にaddした。そうすることで一から学習することなく、前の画像をもらいながら予測できる。


【extrapolationで24時間分の画像予測部分】

f:id:trafalbad:20191117145006j:plain


公開されてたprednetは複雑でネットワークがかなり改造しにくかったので、もっと改造しやすいprednetを実装すればよかった。


【convLSTM系ネットワーク改造例】
f:id:trafalbad:20191117145027j:plain



【他にも色々試して無駄だったこと】

・画像を簡単にする(黒の要素が強い0付近のピクセルは全部ゼロにして雲を強調する)

opencvのaddWeightメソッドで合成する

・cycleGANで予測した画像の補正とかUnetで予測するとかのアイデアと実装してしまったこと


精度を上げるには、metaデータをもっと使ったり、過去データを上手く活用する必要があったかもしれない。




結果まとめ

【一位の人の画像】

f:id:trafalbad:20191117162711j:plain

等高線の軌跡があるので、metaデータと雲量の相関関係を出して、関係のあるmetaデータを予測して、雲と関係の高い値のところをヒートみたいに染めるとかの手法でも使ったのか?

【予測する前の3h分の画像のgif(GroundTruth)】

f:id:trafalbad:20191117162731g:plain





【そこから自分が予測した24h分の画像のgif】

f:id:trafalbad:20191117162751g:plain





はじめてのコンペだったので、下調べに時間使いすぎたり、上手く精度を上げる方法がわからなかった。

投稿した回数は数回で、結果は17位。1位との精度差は10%くらいだった。


とにかく「まず投稿→feedback→改善→投稿」の繰り返しでPDCAサイクルを効率よく回せるかが、精度上げてくののカギっぽい。上位の人ほど投稿数が多い傾向にあった。

ちなみに自分は少ししか投稿しなかったので、何が精度アップに直結するのか把握する余裕がなかったのが後悔した点。


初参加で学んだこと

・下準備や画像生成に直結しない、無駄な画像の特徴把握に時間使いすぎて、1回目の投稿がかなり遅れたこと。

・とりあえずゴミのような駄作でも一度submitまでやってしまうこと。PDCAサイクルが回しやすくなる。

・アイデアは先人の知恵を奪うこと

・なるべく高得点を出せるパターンを見つけてPDCAサイクルを回して改善していく

・とりあえずやったデータやアイデアのログは後から見返せるように、dropboxに保存したり、ノートに記録しておいた。

・いい手法を思いつくには大量に良質なインプットして考えまくるのは変わらない

・今の手法がいいか迷ったらとにかくsubmitして得点だし、feedbackを得ること




はじめてのコンペでわからないことも多かったので、勝つより、経験を積むための初戦だった気がする(もちろん勝つ気でいたけど、当たり前的にレベルが高かった)。

こんなに考えたのは機械学習の中でも1、2位を争うくらいだったので、スキルも上がった。何より発想力、技術力がメッチャ上がるし、気軽に始められるし、勝てればリターンでかいし、いいことずくめだと思った。
(基本、土日も考えるので終わった後の疲労感はやばい)


参考サイト

PredNetを用いた混雑レーダーの未来予測

PredNetのGitHub