俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

【2位解法】Solafune開催「衛星画像から空港利用者数を予測」の振り返り。

アジア初の衛星データ解析コンテストプラットフォーム「Solafune 」で開催された「衛星画像から空港利用者数を予測」に参加し、2位の成績を残せました!

SIGNATEの雲画像予測コンペNishikaのサッカー出場時間予測コンペに続き、またもや、僅差での2位というということでとても惜しい思いがありますが、開催から終了まで、いろいろな皆さんとTwitterなどで、コミュニケーションをとって、お互いよい刺激を与えながら取り組めたとても楽しいコンペでした。

また、今回は画像処理関係についてはSIGNATEの雲画像予測コンペ、アンサンブルやスタッキングについては、ProbSpaceの不動産コンペNishikaのサッカー出場時間予測コンペで培ったノウハウをフル活用して取り組んだ、ある意味、今年の私のとりくみの総決算というべきコンペとなりました。

f:id:kanriyou_h004:20201201154319p:plain
 

では、振り返って参りたいと思います。

1.全体構成

今回のコンペは、画像処理系で回帰の課題でした。これまで、画像処理といえば分類が中心だったので、画像→回帰の流れは、なかなか手応えがありました。

画像処理では、SIGNATEの雲画像予測での経験を活かし、取り組んでいたのですが、データ量が少なくて同じような画像も多くかなり厳しい戦いでした。

基本的には、学習済みのモデルをFinetuningし、組み合わせて、アンサンブル、スタッキングすることで構築していきました。

f:id:kanriyou_h004:20201130142126p:plain

「学習用画像データやラベルデータを画像処理手法により自動で水増しすることや、加工して学習用データとして利用することは可能です」というルールに則り、RandomResizedCropと、RandomHorizontalFlipを実施してデータ量を増やしました。

前処理としては、二値化やエッジ抽出した画像を重ねて、あとは複数のモデルの出力を特徴量とすることで、データ不足を補うことにしました。

結果として、前半は、シングルモデルで、それなりの精度が出せるモデルを大量に作って、終盤近くで、スタッキングした結果、グイグイ精度があがったので、戦略としては正解だったと考えています。


Score推移は以下の通りで、前半はLBスコアを向上させるためのアンサンブルをぐっとこらえて、とにかくシングルモデルでの精度向上に注力しました。

その後、シングルモデルでの精度向上に限界が見え始めたころに、二値化、エッジ抽出、加重平均をとりつつ、最後は、ProbSpaceの不動産コンペのときに効果を発揮した、Stackingで最後のひと押しに成功しました。

前半で、モデル自体のパターンを大量に作ったことが、後々でいろいろ試せたので結果としては良かったと思っています。

f:id:kanriyou_h004:20201201155721p:plain

2.前処理

前処理については、以下の通りで実施いたしました。

【共通処理】         

前処理

処理内容

中心部の切り取り

中心部1700x1700を切り取り。

(この処理は、mygleさんのベースモデルを参考にしました。)

 【個別処理】

前処理

処理内容

グレイスケール変換

OpenCVのcv2.IMREAD_GRAYSCALEや、Pillow(PIL)のconvert("L")を使ってグレイスケールに変換

疑似二値化 グレイスケールに変換後、200以下は0にして、200より大きい値はそのままとする、擬似的な二値化

 

エッジ抽出

OpenCVのcv2.Cannyを使ってエッジの抽出

多重化

グレイスケール画像、二値化画像、エッジ抽出画像をそれぞれ1チャンネルずつを多重化し、3チャンネルの画像を作成

3.モデル構築

 今回は、モデル構築には、上記の前処理画像と、いろいろなモデルの組み合わせで、精度が良いモデルを探索しました。

試したモデルは以下のとおりです。Pytorchを使いました。

バリデーションは、ホールドアウト法を使っていましたが、CVスコアとLBスコアの乖離が激しかったので、とにかくLBスコアが向上できるよう、大量にサブミットを実施しました。(通算300個以上のモデルを作って、選抜したモデルの出力をほぼ毎日提出しました。)

  • VGG-16,VGG-19,VGG-16bn,VGG-19bn
  • ,ResNet-18,ResNet-34,ResNet-50,,ResNet-101,ResNet-152
  • Wide-Resnet101
  • ResNeXt-50-32x4d,ResNeXt-101-32x8d
  • Dencenet-201,Dencenet-161
  • efficientnet-b5,efficientnet-b7

最終的には、以下の4つの組み合わせを採用しました。

  • そのままの画像→efficientnet-b7 モデル1
  • 二値化画像→ResNeXt-50-32x4d モデル2
  • エッジ抽出画像→ResNet-34 モデル3
  • 多重化画像→efficientnet-b7 モデル4

その後、この4つの組み合わせで加重平均をとりました。

精度の良かったモデルの加重を大きめにするなど、いろいろな組み合わせを試した結果以下を採用しました。

  • モデル2、モデル3の加重平均
  • モデル1、モデル2、モデル3の加重平均
  • モデル1、モデル2、モデル3、モデル4の加重平均

その後、上記7つのモデルの出力をインプットとするスタッキングを構成しました、二層目のモデルにはLightGBM、XGBoost、ニューラルネットワーク(MLPRegressor)を試してみた結果、3層のニューラルネットワーク(MLPRegressor)を採用しました。

最終的な構成は以下のとおりです。

バリデーションはクロスバリデーションを使いました。最終提出のモデルのFold数は、12になります。前半と比べてCVスコアとLBスコアの乖離が小さくなったものの、余りCVスコアの信頼性がなく、相対的な評価として利用し、一つ一つLBスコアを確認していくアプローチで対応しました。

f:id:kanriyou_h004:20201130142126p:plain

4.感想

今回のコンペは、SIGNATEの雲画像予測につづいて、衛星画像データを使ったコンペに挑戦となりました。奇しくも、取り組んでいる最中に野口宇宙宇宙飛行士が民間企業SPACE-X社のクルードラゴンで国際宇宙ステーションに到着したり、若田宇宙飛行士、古川宇宙飛行士が国際宇宙ステーションに行くミッションが決まったり宇宙ネタが多い1ヶ月だったので、テンションがあがりました。

データ分析としても、画像処理あり、回帰ありと、これまで取り組んできたコンペの要素の総決算でした。

データの少なさについては、Data Augmentationと、複数のモデルを片っ端から検証し、その出力を特徴量として採用した回帰とすることで、うまく精度を上げることができました。

しかしながら、たまたま選んだ戦略がうまくいっただけで、なぜうまくいったのかも理解できていませんし、どのようなデータの場合、今回の戦略が適用できるかもわかっていません。

まだまだ、勉強不足なので、もっと理論も勉強して、最初にデータを分析した上で、根拠をもって、「この戦略でいったほうがよい」と判断できるようになりたいと思います。特に画像処理系コンペでは、計算時間にものすごく時間がかかるので、戦略をミスると、やり直しが効かず、終了してしまいますので。。。

今回のコンペでの教訓も今後に活かしていきたいと思います。

5.謝辞

最後となってしまいましたが、本コンペを運営してくださいました、Solafune の運営の皆様、一緒にコンペに取り組んでいらっしゃった皆様、Twitter上でやりとりを実施させていただいた皆様に心より感謝申し上げます。

また、データのもととなっている衛星データのご提供関係者の皆様、宇宙に関して夢と希望を、そして様々な衛星や宇宙での実験結果による多大なる恩恵をもたらしてくださいまして誠に感謝しております。

私も、皆様に夢と希望を与えられるような実績を残せるよう精進してまいりたいと思います。

 

【過去記事】

G検定、E資格の取得から、これまでに取り組んできた道のりは以下にまとめております。何かのご参考にしていただければ幸いです。

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com