皆さんこんにちは
機械学習チームYAMALEXの@tereka114です。
YAMALEXは Acroquest 社内で発足した、会社の未来の技術を創る、機械学習がメインテーマのデータサイエンスチームです。
(詳細はリンク先をご覧ください。)
日本時間3/2までKaggleで開催されていたコンペティションである「1st and Future - Player Contact Detection」がとても面白かったのでその共有をします。
なお、私が所属したチームは9位で金メダルを獲得しました。ソリューションは次に記載されておりますので、ご確認ください。
どのようなコンペだったのか。
NFLに関するコンペはここ数年連続で開催されています。
1年目:プレイヤーのヘルメットの座標を衝突したか否かを検出する。
2年目:プレイヤーのヘルメットごとにプレイヤーをアサインする。
そして今年で3年目になりますが、プレイヤー同士(どのプレイヤーとプレイヤー)とプレイヤーと地面に対するいつ衝突したのかを検知するものになりました。
詳細は公式の動画を御覧ください。緑がプレイヤーとプレイヤー同士の衝突、赤はプレイヤーと地面の衝突を示しています。
これらを判定するのに、先程のフィールドの側面方向から撮影されたSideline方面からの動画に加え、次のデータが存在します。
- ゲーム中の動画(視点の違う動画、フィールドの側面からの動画であるSideline、両端のゴール側のどちらかから撮影されるEndzone、全体が遠方から映るAll29の3種類)
- 各プレイヤーのセンサー
- 昨年度コンペのソリューションを使ったヘルメットのBoudingBox(All29には存在しない)
コンペ終了後に公開された他チームのソリューションを読みましたが今までのコンペと比較して内容が多種多様で、面白かったです。
※公式のコンペティション概要
www.kaggle.com
解法のポイント
ここからは、他のチームも含んだソリューションの中で面白かった内容をコンペのポイントごとに紹介していこうと思います。
時系列解析モデリング
動画の中で衝突を判定したいフレームのみを解析に使っても、プレイヤーの動きまでは分からず、衝突しているか不明です。
そのため、複数のフレームを利用したモデリングを行う必要があります。
最も標準的な手法は2Dの画像を用いたChannelにすべての隣接する時系列を入力することです。
グレースケールにすることにより1chで1フレームを表現でき、かつ、色変化が少なくなり、頑強になります。今回色情報は殆ど意味がないのでこの方法が使えました。
他にもLSTM, Transformer, 3DConvolutionなど、この部分について多種多様なソリューションを利用されていました。
私の所属するチームでもマージ前のモデルの内容は異なっていました。一例として、3DConvolutionを利用した私のモデルのリンクを置いておきます。
※3DConvolution適用の例
www.kaggle.com
他のソリューションで独特だったのは、3位の1Stageモデルです。
CNNの特徴抽出とTransformerを利用したモデリングによって、End2Endで推論していました。詳しくは該当のDiscussionを見てもらえると良いと思います。
プレイヤーの解析
今回得られているBoudingBoxの情報はヘルメットのみのため、プレイヤーの身体の位置などヘルメット以外の位置の情報は利用できず、衝突したかどうかを判定することができません。
そのため、ヘルメットのBoudingBoxを利用して人を切り出す方法が取られていました。
一番基本的なものは、
ヘルメットを基準として上下左右で決められたpxを切り出す、
といったものですが、他にも様々な工夫がなされていました。
- ヘルメットのサイズ(横幅x高さ)を利用して、人物の切り出し領域を決定する。(ヘルメットの横幅x5倍など)
- YOLO系統の高速なモデルを利用して物体検出し、ヘルメットと物体検出した結果を対応させる。
- End2Endで切り出しを考慮したモデルを構築する。
私の所属していたチームではYOLO系統の解析とヘルメットのサイズを利用する手法を用いました。
チームマージする前に様々なことを各々試していましたが、議論したり、色々と所感を聞くと、YOLO系統が最も精度が良かったと思います。
※当チームのYOLOを利用したソリューション部
www.kaggle.com
なお、本問題の対処において特殊な例として、End2Endで人物を注力して切り出す手法を構築したソリューションもありました。
※End2Endで人物を注力して切り出す手法(コンペ4位)
www.kaggle.com
混雑している際の衝突するプレイヤーの扱い
先に説明した通り、動画から切り出すだけでは、混雑している中だと、どのプレイヤーの衝突かを判定するのが難しいです。
そのため、以下の手法が取られました。
- 解析対象のプレイヤーのみヘルメットに対して付与されたBoudingBoxを塗りつぶした画像を解析する。(コンペ1位)
- ヘルメットマスク用の画像をChannelに入力する。(コンペ2位)
これによりマスクを塗りつぶしているヘルメット同士など、より判定できるようになったのが強みだと思います。
最後取り込むことができなかったのですが、ヘルメット解析用のニューラルネットワークを作ることで効果があったので、上記手法が有効であったのだと思います。
センサーの解析
本手法では、センサーを解析するのも重要なポイントです。
動画で見えていない箇所、混雑している箇所で動画から確認しづらいポイントがあるので、プレイヤーに着用されているセンサー情報も有用でした。
プレイヤー同士の関係性を示す時間特徴量(速度など)とセンサーに加えて画像の特徴(BoudingBox関連)を利用していました。
これらを用いたLightGBMでも相当なスコアが出るようです。(0.750前後)
なお、1位のソリューションではプレイヤーのセンサー情報を用いて画像を生成していました。
画像としてより直感的に解析できるのが精度向上のポイントだったのかなと理解しています。
※1位のソリューション
www.kaggle.com
計算量の削減工夫
このコンペティションは時間、空間の両方の解析を必要としており、時間がかかり、かつ、Notebookコンペティションともあり推論時間が制限されていました。
そのため、どのように推論時間を節約するのかはコンペティションの中で重要な要素の一つでした。コンペ後で振り返ると以下の手法が取られていました。
- 画像のキャッシュ
連続して出現する事が多いので、一時的にメモリで持つことで読み込みの時間を削減する。 - 画像の.npy化
cv2.imreadで画像を読み込むよりも.npyのほうが性能が良い。 - LightGBMによるフィルタリング
LightGBMで特徴量を作って計算するのは圧倒的に性能が高速になるため、絶対にありえない、ありえるといった確度が極端なものをフィルタリングすることで、解析するデータを削減する。
画像のキャッシュと.npy化によって性能を上げるなどアンサンブルにおける工夫を進めていました。
フィルタリングについては、実は最後に思いついて、時間がなく、深めることができませんでした。
この方法は今後、様々なコンペティションで応用できそうだと考えています。
最後に
私がこれまでに参加したコンペの中で5本の指に入るほど、検討内容が多く、正直大変なコンペだったと思っています。
ただ、反面様々なことを学べたのは本当に良かったと感じています。
また、このような刺激のあるコンペに参加したいです!
Acroquest Technologyでは、キャリア採用を行っています。
- ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
- Elasticsearch等を使ったデータ収集/分析/可視化
- マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
- 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長
少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。