このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
2022年7月から10月にかけて開催されたKaggleコンペティション DFL – Bundesliga Data Shootout に弊社エンジニア3名のチームで参加し、530チーム中6位の成績を収めました。
この結果弊社チームに金メダルが与えられ、2名がKaggle Competitions Masterの称号を獲得しました。
本投稿ではコンペの概要と解法について紹介します。
サッカーの試合を撮影した動画が与えられ、その中から特定のアクションが発生したタイミングおよび種別(プレイ、スローイン、チャレンジの3種類のいずれか)を識別するというタスクでした。
参加者には以下のデータセットが提供されました。
学習用ラベルとしてはアクションが発生したタイミングと種別等の最低限の情報が与えられていましたが、
各参加者が独自に追加のラベルを付与して学習することもルール上許容されていました。
参加者が作成する必要がある推論コードでは以下の条件で予測を出力することが求められました。
モデルの精度評価はコンペ独自のmean Average Precision(以下、mAP)が採用されました。
今回のコンペでのmAPの定義は以下の通りです。
Kaggleでは参加者がモデルの学習・推論コードをフォーラムに共有することが盛んに行われており、今回も参考になるコードがいくつか投稿されていました。
弊社チームではベースライン手法としてtitoさんの以下のNotebookを参考にさせていただきました。
ベースライン手法の概要は以下の通りです。
基本的な考え方はベースライン手法に基づきつつ、時系列情報の活用およびコンペでよく利用される精度改善トリックの適用を実施しました。
またモデルの推論時間にも制約(testデータに対する予測を9時間以内に完了しなければならない)があったため、いくつか推論時間短縮の工夫も適用しています。
詳細なパラメータ設定等はKaggleのフォーラムに以下の記事を投稿していますので、もし興味がございましたらそちらも合わせてご参照ください。
A simple approach based on baseline notebooks (6th place solution)
ベースラインモデルの精度を上げるためには時系列情報をどのようにモデルに組み込むかが課題となりました。
入力動画が与えられた際に時系列情報を活用したモデルを構築する方法はいくつか考えられますが、
弊社チームでは連続する3枚のフレームを2次元画像のチャンネル方向に結合する2.5次元CNNアプローチを最終的に採用しました。
処理の概要は以下の通りで非常にシンプルな方法ですが、今回のタスクでは比較的短いスパンのアクション識別だったこともあってか、
単一フレームのみを使用した予測と比較すると十分に効果がありました。
図で表すと下記の通り時系列方向の情報が2次元の画像として表現されていて、そのまま2次元CNNモデルに入力して学習・推論を実行すれば時系列情報を考慮した予測が可能となります。
今回適用したトリックは以下の通りです。Kaggleの画像系コンペによく参加されている方にとっては一般的な手法ばかりだと思いますが、簡単に紹介します。
今回はKaggleのサーバ上でモデルの予測を実行するCode Competitionの形式で開催され、モデルの予測に掛けられる時間が9時間以内に制限されていました。
そのため、精度の良いモデルを単純に組み合わせるだけでなく、モデルの取捨選択や実行時間の制限を満たすように推論方法を工夫することも要求されました。
最終モデルには以下のような工夫を取り入れました。
今回実施した主要な実験によるスコアの推移を下表のとおりです。
ローカルの評価値(Val AP)とKaggleプラットフォーム上でのPublicスコア(Public LB)が相関していたので、精度改善作業が非常にスムーズに進みました。
最終提出ではVal APおよびPublic LBでスコアの良かったID13, 14を選択しました。
ID | description | model | Val AP | Public LB | Private LB |
---|---|---|---|---|---|
1 | titoさんのベースラインモデル | b5_ap | 0.215 | 0.249 | N/A |
2 | + Test time augmentation | b5_ap | N/A | 0.255 | N/A |
3 | + ラベルエラーの修正 | b5_ap | 0.242 | 0.283 | N/A |
4 | + 前後1フレーム飛ばしの2.5次元画像を使用 | b5_ap | 0.312 | 0.425 | N/A |
5 | + 入力画像の解像度を960×540に変更、2フレームごとに推論 | b5_ap | 0.554 | 0.563 | N/A |
6 | + loss関数を4クラスBinary cross entropy lossに変更 | b5_ap | 0.609 | 0.618 | N/A |
7 | + カスタムデータローダー | b5_ap | 0.625 | 0.634 | N/A |
8 | + データ拡張の追加 | b5_ap | 0.7 | 0.703 | N/A |
9 | + b5モデルをb0モデルに軽量化、4-foldのモデルアンサンブル | b0_ap (4-fold) | 0.669 | 0.72 | N/A |
10 | + 2フレームごとに推論した際に飛ばしたフレームの予測を線形補間で生成 | b0_ap (4-fold) | 0.686 | 0.74 | N/A |
11 | + 入力画像の解像度を1280×720に変更、3-foldのモデルアンサンブル | b0_ap (3-fold) | 0.722 | 0.772 | N/A |
12 | + Mixupデータ拡張追加 | b0_ap (3-fold) | 0.747 | 0.761 | N/A |
13 | + 3つのb0モデルの内、1つをb1モデルに置き換え | b0_ap (2-fold), b1_ap (1-fold) | 0.751 | 0.768 | 0.802568 |
14 | + 3つのフル学習b0モデル (各モデルは前後1フレーム、2フレーム、3フレーム飛ばしの2.5次元画像を使用) | b0_ap (full-fit, time_stride=1, 2, 3) | 0.753 | 0.782 | 0.803753 |
Kaggleではコンペ終了後に参加者が自分の解法をフォーラムに投稿することが慣例となっています。
ここではそのような投稿の中から上位チームの解法について簡単に紹介します。
今回のタスクは定番のタスクというわけではなかったため、使用するデータやモデルパイプラインに各チーム各様の工夫が見られました。
1位のチームの解法はシンプルではあるのですが、他のチームに比べて圧倒的に高いスコアを示していました。
弊社チームの解法も2.5次元情報を入力として使用するという部分では共通していて、そのテクニックだけでもスコアが大幅に伸びました。
しかし2.5次元情報からさらにその先で3次元情報として集約するという点が大きく異なる点であり、そこでスコアに差が付いているものと考えられます。
さらに詳しい内容は各チームの方がKaggle上にソリューションまとめを共有してくれていますので、そちらも合わせてご参照ください。
本投稿では弊社チームで参加したKaggleコンペについて、コンペの概要や金メダルを獲得した解法を簡単にご紹介しました。
他の上位チームの解法と比較してシンプルな方法ですが、それなりに良いスコアを獲得することが出来ました。
これから画像系のコンペに参加されようとしている方の参考になれば嬉しいです。
本コンペには、Fixstars全社の有志で活動しているKaggleグループの取り組みとして参加しました。
Kaggleグループではチームを組んでコンペに参加したり、またソロでのコンペ結果をグループ内で報告したりして、機械学習の技術力向上に努めています。
コンピュータビジョンセミナーvol.2 開催のお知らせ - ニュース一覧 - 株式会社フィックスターズ in Realizing Self-Driving Cars with General-Purpose Processors 日本語版
[…] バージョンアップに伴い、オンラインセミナーを開催します。 本セミナーでは、...
【Docker】NVIDIA SDK Managerでエラー無く環境構築する【Jetson】 | マサキノート in NVIDIA SDK Manager on Dockerで快適なJetsonライフ
[…] 参考:https://proc-cpuinfo.fixstars.com/2019/06/nvidia-sdk-manager-on-docker/ […]...
Windowsカーネルドライバを自作してWinDbgで解析してみる① - かえるのほんだな in Windowsデバイスドライバの基本動作を確認する (1)
[…] 参考:Windowsデバイスドライバの基本動作を確認する (1) - Fixstars Tech Blog /proc/cpuinfo ...
2021年版G検定チートシート | エビワークス in ニューラルネットの共通フォーマット対決! NNEF vs ONNX
[…] ONNX(オニキス):Open Neural Network Exchange formatフレームワーク間のモデル変換ツー...
YOSHIFUJI Naoki in CUDAデバイスメモリもスマートポインタで管理したい
ありがとうございます。別に型にこだわる必要がないので、ユニバーサル参照を受けるよ...