2023年5月9日に開催した、「Kaggle スコアアップセミナー DFL Bundesliga Data Shootout 編」の当日資料です。
Copyright© Fixstars GroupKaggleスコアアップセミナー画像系コンペ DFL – Bundesliga Data Shootout 編
View Slide
Copyright© Fixstars Group本セミナーの位置づけ● Kaggle コンペで金メダルの獲得、Kaggle Competition Master の称号獲得● もともと機械学習の専門家の少なかったエンジニアチームによる、継続的な Kaggle への取り組み● Kaggle スコアアップセミナー⚫ 参加したコンペの概要と解法の紹介や、Kaggleに参加してみたい方向けに複数回の情報発信を企画中● 今回のセミナー● 画像系コンペティション「DFL – Budesliga Data Shootout」の概要と解法と、ブログでは書ききれなかった理由と具体的な手段についての解説● 対象者● 画像処理と機械学習・深層学習を扱っている方● 今後 Kaggle に挑戦し、スコアを上げていきたいと考えている方2
Copyright© Fixstars Group発表・資料作成者紹介冨田 明彦 (発表)ソリューションカンパニー営業企画2008年に入社。金融、医療業界において、ソフトウェア高速化業務に携わる。その後、新規事業企画、半導体業界の事業を担当し、現職。3飯塚 康太 (発表)ソリューション第二事業部シニアエンジニア2019年入社。車載向けの深層学習アプリケーション、特に物体検出・トラッキングの開発を担当している。Kaggle Competitions Master水野 孝祐 (資料作成)ソリューション第二事業部リードエンジニア2016年に入社。ディープラーニングを用いた自動車向けの画像認識アルゴリズム開発に携わる。Kaggle Competitions Master
Copyright© Fixstars Group本日のAgenda● フィックスターズのご紹介● DFLコンペ6位解法紹介● コンペの概要● 解法の概要● 改善手法の詳細● Q&A / 告知4
Copyright© Fixstars Groupフィックスターズのご紹介5
Copyright© Fixstars Groupフィックスターズの強みコンピュータの性能を最大限に引き出す、ソフトウェア高速化のエキスパート集団ハードウェアの知見 アルゴリズム実装力 各産業・研究分野の知見6目的の製品に最適なハードウェアを見抜き、その性能をフル活用するソフトウェアを開発します。ハードウェアの特徴と製品要求仕様に合わせて、アルゴリズムを改良して高速化を実現します。開発したい製品に使える技術を見抜き、実際に動作する実装までトータルにサポートします。
Copyright© Fixstars Groupサービス概要お客様専任のエンジニアが直接ヒアリングを行い、高速化を実現するために乗り越えるべき課題や問題を明確にしていきます。高速化のワークフローコンサルティング先行技術調査性能評価・ボトルネックの特定高速化アルゴリズムの改良・開発ハードウェアへの最適化レポート作成サポートレポートやコードへのQ&A実製品への組込み支援7高速化したコードオリジナルソースコードのご提供お客様
Copyright© Fixstars Groupサービス提供分野8半導体自動車産業機器生命科学金融● NAND型フラッシュメモリ向けファームウェア開発● 次世代AIチップの開発環境基盤● 自動運転の高性能化、実用化● 次世代パーソナルモビリティの研究開発● Smart Factory実現への支援● マシンビジョンシステムの高速化● ゲノム解析の高速化● 医用画像処理の高速化● AI画像診断システムの研究開発● デリバティブシステムの高速化● HFT(アルゴリズムトレード)の高速化
Copyright© Fixstars Groupサービス領域様々な領域でソフトウェア高速化サービスを提供しています。大量データの高速処理は、お客様の製品競争力の源泉となっています。9組込み高速化画像処理・アルゴリズム開発分散並列システム開発GPU向け高速化FPGAを活用したシステム開発量子コンピューティングAI・深層学習自動車向けソフトウェア開発フラッシュメモリ向けファームウェア開発
Copyright© Fixstars GroupAI・深層学習向け技術支援AIを使うためのハードウェア選定や、高速な計算を実現するソフトウェア開発技術で、お客様の製品開発を支援します。お客様の課題推論精度を維持したまま計算時間を短縮したい組込みデバイス向けにAIモデルを軽量化したいご支援内容AIモデル設計データの前処理・後処理推論精度の改善分散処理による学習高速化モデル圧縮・推論の高速化学習計算を高速化して研究開発を効率化したい精度と計算時間を両立するAIモデルを開発したい10
Copyright© Fixstars GroupAIを用いた乳房超音波検査リアルタイム解析システム慶應義塾大学医学部外科学(一般・消化器)教室様111 超音波検査装置が描出する動画をリアルタイム処理できる高速なAIを開発2 検査しながらAIによる診断補助が実現できる3 見落としを減らし、早期の乳がんの発見と治療が可能になる高確率でがん生命科学分野 サービス領域 AI・深層学習向け技術支援高確率で良性腫瘍子会社のSmart Opinion社で、乳がんの超音波画像に対し、精密検査の要否を高速かつ高精度に判別するAIを開発(現在認可申請中)
Copyright© Fixstars GroupDFLコンペ6位解法紹介12
Copyright© Fixstars GroupDFLコンペ6位解法紹介● 本発表では弊社チームで参加したKaggleコンペ DFL - Bundesliga Data Shootout の6位解法を紹介します● 弊社techブログやKaggle discussionにも解法を投稿していますが、単なる手法の説明だけでなく各手法を採用するに至った背景や理由についても合わせて解説します○ tech blog: https://proc-cpuinfo.fixstars.com/2023/02/kaggle-dfl2022/○ Kaggle discussion: https://www.kaggle.com/competitions/dfl-bundesliga-data-shootout/discussion/36087213
Copyright© Fixstars Groupアウトライン● コンペ概要● 解法概要● 改善手法の詳細14
Copyright© Fixstars Groupコンペ概要15
Copyright© Fixstars Groupコンペ概要● DFL - Bundesliga Data Shootout○ URL: https://www.kaggle.com/competitions/dfl-bundesliga-data-shootout● タスク○ サッカーの試合を撮影した動画が与えられ、その中から特定のアクションが発生したタイミングおよび種別(プレイ、スローイン、チャレンジの3種類のいずれか)を識別● タイムライン (日本時間)○ 2022/06/30: コンペ開始○ 2022/10/14: 提出締め切り (最終スコア算出用に2022シーズンのデータ収集&教示開始)○ 2022/12/21: コンペ終了 (新しいデータでの最終スコア算出およびLB更新完了)16
Copyright© Fixstars Group識別対象● アクションが発生したタイミング○ 動画の先頭を基準とした秒数● アクションの種別○ プレイ■ パスまたはクロス(フリーキックやコーナーキックも含む)等、チーム内でボールをやり取りするアクション○ スローイン■ ボールがゲームエリア外に出た後に手でボールを投げてプレイを再開するアクション○ チャレンジ■ 両チームのプレイヤーがボールを自分の制御下に置こうとする(ボールに対する競り合い、ファウル等)アクション17
Copyright© Fixstars Groupデータセット● 与えられたデータセット○ train■ フルゲーム4試合分の8動画 (1動画約60分, 25fps, 1920x1080)■ ハーフゲーム4試合分の4動画 (1動画約60分, 25fps, 1920x1080)○ test■ 提出動作確認用の32動画 (1動画30秒, 25fps, 1920x1080)○ clips■ 10試合から短い区間を抽出された200動画 (1動画30秒, 25fps, 1920x1080)○ train.csv■ train動画に対応するアノテーションデータ● Leaderboard用データセット○ Public■ フルゲーム1試合分の2動画■ ハーフゲーム4試合分の4動画 (trainのハーフゲームとペアになる動画)○ Private■ Publicと同等規模の動画 (詳細不明)18train.csvの内容例
Copyright© Fixstars Group評価方法● Kaggleのサーバ上でPrivateデータセットに対して推論を実行○ 推論は9時間以内に完了させる必要がある○ テストデータは6 [動画] x 60 [分/動画] x 60 [秒/分] 25 [fps] = 540,000フレームなので、540,000 / (9 x 60 x 60) = 16.67 fps以上で推論を実行できる必要がある● 精度評価指標○ Average Precisionベースの指標■ ①: アクション毎に閾値毎のAPを計算■ ②: ①の各閾値での結果を平均■ ③: ②の各アクションでの結果を平均19
Copyright© Fixstars Group解法概要20
Copyright© Fixstars Groupベースライン手法● 多クラスの画像識別問題として解く方法 (titoさんの手法)○ 入力動画の各フレームをそれぞれ4クラス(背景+ターゲット3クラス)のいずれかに識別するタスクとして学習・推論を実行○ 推論時の後処理で時間方向にNMSを適用し、一定期間内の予測を1つに抑制○ モデルはEfficientNet B5を使用○ 学習・推論フレームワークとしてPyTorchおよびtimmを使用21t-2 t-1 t t+1 t+2入力フレーム参考Notebookhttps://www.kaggle.com/code/its7171/dfl-benchmark-traininghttps://www.kaggle.com/code/its7171/dfl-benchmark-inference識別結果bg bg play bg bgNMS結果各フレームの識別時間方向にNMS適用bg play play play bg
Copyright© Fixstars Group弊社チームの6位解法● 時系列方向の情報を加味して多クラスの画像識別問題として解く方法○ 基本的な学習・推論パイプラインはベースライン手法と同様○ 時系列情報を活用するために時間方向に隣接するフレームを結合して処理させる2.5次元CNNアプローチを採用○ 画像コンペでよく利用される一般的な精度改善トリックを適用 (詳細後述)22Kaggle Discussionへの投稿https://www.kaggle.com/competitions/dfl-bundesliga-data-shootout/discussion/360872t-2 t-1 t t+1 t+22.5次元フレーム識別結果bg bg play bg bgNMS結果各2.5次元フレームの識別時間方向にNMS適用bg play play play bgt-2 t-1 t t+1 t+2入力フレーム各フレームをグレイスケール変換&前後フレームを結合
Copyright© Fixstars GroupValidation戦略● ① フルゲーム1試合分をvalデータとして抽出し、残りをtrainデータとする○ trainに含む試合のバリエーションを増やしたい (ハーフゲームは可能な限りtrainに含めたい)○ trainとvalそれぞれに同じ試合を含めない○ データがあまり多くない場合、train:valの比率は4:1 or 5:1ぐらいが経験的に良い■ 今回の分割方法ではtrain:val=5:1になる● ② Cross validationを実施する場合は①の要領で各foldを生成する○ 今回のデータにはフルゲーム4試合分が存在したので4 foldまで生成可能● ③ Local ValスコアとPublic LBスコアの相関が無ければ分割方法を見直す23
Copyright© Fixstars Group00.10.20.30.40.50.60.70.80.91 2 3 4 5 6 7 8 9 10 11 12 13 14実験IDスコアの推移Val APPublic LBPrivate LBGold lineSilver lineBronze line実験毎のスコア推移● Local ValスコアとPublic LBスコアがほぼほぼ相関していたので分割方法を見直す必要はありませんでした24Hold-out validation Cross validation
Copyright© Fixstars Group改善手法の詳細25
Copyright© Fixstars Group改善手法の詳細● ここからは今回のコンペで適用した各改善手法の詳細について説明していきます● 基本的にはコンペ開催中に試した時系列順に説明しますが、必ずしもこの順番で試すのがベストというわけではございませんので、もしご参考いただける場合は各自のコンペに応じて調整してください● また紹介する手法は最終的に採用されたものに絞って説明します。これ以外にも様々な実験を実施していますが詳細は割愛させていただきます26
Copyright© Fixstars Group改善手法の全体像● 今回の最終解法に採用された手法および各実験結果は以下の通りです27実験ID description model Val AP Public LB Private LB1titoさんのベースラインモデル b5_ap 0.215 0.249 0.2437532+ Test time augmentation b5_ap 0.228 0.255 0.2478923+ ラベルエラーの修正 b5_ap 0.242 0.283 0.2965064+ 前後1フレーム飛ばしの2.5次元画像を使用 b5_ap 0.312 0.425 0.4527675+ 入力画像の解像度を960×540に変更、2フレームごとに推論 b5_ap 0.554 0.563 0.6194316+ loss関数を4クラスBinary cross entropy lossに変更 b5_ap 0.609 0.618 0.6643717+ カスタムデータローダー b5_ap 0.625 0.634 0.6742298+ データ拡張の追加 b5_ap 0.7 0.703 0.7258129+ b5モデルをb0モデルに軽量化、4-foldのモデルアンサンブル b0_ap (4-fold) 0.669 0.72 0.74491110+ 2フレームごとに推論した際に飛ばしたフレームの予測を線形補間で生成 b0_ap (4-fold) 0.686 0.74 0.75578711+ 入力画像の解像度を1280×720に変更、3-foldのモデルアンサンブル b0_ap (3-fold) 0.722 0.772 0.79840712+ Mixupデータ拡張追加 b0_ap (3-fold) 0.747 0.761 0.79976913+ 3つのb0モデルの内、1つをb1モデルに置き換え b0_ap (2-fold), b1_ap (1-fold) 0.751 0.768 0.80256814+ 3つのフル学習b0モデル(各モデルは前後1フレーム、2フレーム、3フレーム飛ばしの2.5次元画像を使用)b0_ap (full-fit, time_stride=1, 2, 3) 0.753 0.782 0.803753
Copyright© Fixstars GroupID1: titoさんのベースラインモデル● 既に説明した通り、今回はtitoさんの手法をベースラインとして採用しました○ 特に理由が無ければ評価の高い公開Notebookから始めるのが確実です○ もし自分でベースラインを作成する場合にはそのタスクで実績のあるシンプルなモデルから始めるのがオススメです● スコア○ val: 0.215 (baseline)○ Public LB: 0.249 (baseline)● 参考Notebook○ https://www.kaggle.com/code/its7171/dfl-benchmark-training○ https://www.kaggle.com/code/its7171/dfl-benchmark-inference28
Copyright© Fixstars GroupID2: Test time augmentation● 左右flipを適用○ 画像系コンペではmulti-scaleやクロップの拡張もよく適用されますが、処理時間の関係でバリエーションを増やせないため今回は適用していません○ 推論時間が増えてしまうため本来はコンペの最終盤で適用すればよいと思います。ただしTTAは必ず入れたい処理のため、TTAを入れた場合に処理時間制約を満たせることを都度確認しておくことが重要です● スコア○ val: 0.215 (baseline) → 0.228○ Public LB: 0.249 (baseline) → 0.25529
Copyright© Fixstars GroupID3: ラベルエラーの修正● 与えられた正解データから学習用のラベルを生成する際に意図しない変換が行われていたため修正しました○ たとえKaggle Grandmasterが作成したNotebookであっても間違いは起こり得るので、内容を鵜呑みにせず実際に自分の頭で処理内容を理解することが重要です● スコア○ val: 0.228 → 0.242○ Public LB: 0.255 → 0.283● 修正の詳細は以下参照○ https://www.kaggle.com/code/kmizunoster/dfl-benchmark-training-fix-label-error30
Copyright© Fixstars GroupID4: 時系列情報の活用● 時系列情報を活用するために時間方向に隣接するフレームを結合して処理させる2.5次元CNNアプローチを採用○ ベースラインモデルで学習する中でtrainデータに対しても十分に学習出来ていない傾向(つまり未学習の状態)が見えたため、入力するデータに工夫をする必要性を感じました○ 時系列方向の情報を加える方法はいくつか考えられますが、学習・パイプラインをそのまま活用可能かつシンプルな本手法をまずは採用しました● スコア○ val: 0.242 → 0.312○ Public LB: 0.283 → 0.42531
Copyright© Fixstars GroupID5: 入力画像の高解像度化 (1回目)● ベースラインが456 x 456のところ、960 x 540に上げました○ これまでの経験上、許容される範囲内で可能な限り解像度を上げると良い結果が得られることが多いです● 解像度を上げたことで推論時間が間に合わなくなったため、1フレーム飛ばして推論する変更も同時に適用しています● スコア○ val: 0.312 → 0.554○ Public LB: 0.425 → 0.56332
Copyright© Fixstars GroupID6: loss関数の修正● ベースラインではSoftmax cross entropyを使用していましたが、4クラスのbinary cross entropyに変更しました○ loss関数は解きたい問題や評価指標に応じて適切なものを選択することで精度が大きく変わります○ 今回の評価指標では、最初に各クラス独立にスコアを算出した上で最後に平均を取っているため、クラス間でスコアを調整するSoftmaxは合っていないと考えました○ 今回は4クラスのままにしましたが、背景クラスは前景クラスが全て0である場合と等価なので、3クラスにすることも可能です● スコア○ val: 0.554 → 0.609○ Public LB: 0.609 → 0.61833
Copyright© Fixstars GroupID7: カスタムデータローダの実装● 推論時間が足りなくなってきたため、 CPUでの前処理とGPUでの推論処理をパイプラインで処理させることで高速化を実施しました○ Kaggle上のGPU NotebookではCPUを2コアまで使用可能● 本作業の目的は高速化でしたが精度にもプラスの影響がありました。従来の推論処理では動画から静止画に切り出す際に画質が劣化していましたが、ファイルに吐き出さずに処理できるようにしたため精度劣化を抑制できました● スコア○ val: 0.609 → 0.625○ Public LB: 0.618 → 0.63434改善前前処理 推論 前処理 推論前処理推論前処理 前処理 前処理推論 推論改善後コア0コア0コア1
Copyright© Fixstars GroupID8: データ拡張の改善● ベースラインはImageNet用のデータ拡張を流用していたため、今回のデータセットに応じた調整を行いました○ 修正前: RandomResizedCropAndInterpolation, RandomHorizontalFlip, ColorJitter(brightness,contrast)■ スケールのrangeが広すぎるため、拡張後の画像にボールの領域が入らないことがありました○ 修正後: RandomAffine or RandomPerspective, RandomHorizontalFlip, ColorJitter(brightness,contrast)■ スケール以外の画像変形の要素を加えるため、RandomAffineとRandomPerspectiveに変更■ 拡張後の画像を見ながらちょうど良いスケールを設定● スコア○ val: 0.625 → 0.7○ Public LB: 0.634 → 0.70335
Copyright© Fixstars GroupID9: モデルの軽量化 + モデルアンサンブル● ベースラインのEfficientNet-b5からb0に変更しました○ これまでの学習で過学習の傾向も見えていたため、モデルの表現力を落として過学習を抑制したいという目的もありました● 変更した結果、処理時間に余裕が生まれたためfold-wiseのアンサンブル処理を追加しています● スコア○ val (4-fold): 0.669○ Public LB: 0.703 → 0.7236EfficientNet-b0 (fold 0)入力画像EfficientNet-b0 (fold 1)EfficientNet-b0 (fold 2)EfficientNet-b0 (fold 3)平均 予測
Copyright© Fixstars GroupID10: 線形補間処理の追加● 1フレーム飛ばしで生成した予測について、飛ばしたフレームの予測を隣接フレームの結果から線形補間する処理を追加しました● スコア○ val (4-fold): 0.669 → 0.686○ Public LB: 0.72 → 0.7437
Copyright© Fixstars GroupID11: 入力画像の高解像度化 (2回目)● さらに精度を上げるため解像度を960 x 540から1280 x 720に変更● 4-foldのアンサンブルでは推論時間が間に合わなかったため、3-foldのアンサンブルに変更● スコア○ val (3-fold): 0.722○ Public LB: 0.74 → 0.77238
Copyright© Fixstars GroupID12: Mixupの追加● Mixupを追加しました○ timmであればオプションで簡単にON/OFF可能● これまでの改善と異なり、valは向上した一方でPublic LBは劣化しましたが、localのスコアを信頼してMixupを最終解法でも採用しています● スコア○ val (3-fold): 0.722 → 0.747○ Public LB: 0.772 → 0.76139
Copyright© Fixstars GroupID13: 一部モデルの変更● 処理時間にやや余裕があったため3-foldのモデルの内、1つをEfficientNet-b1に変更● スコア○ val (3-fold): 0.747 → 0.751○ Public LB: 0.761 → 0.76840
Copyright© Fixstars GroupID14: 全学習データを用いて再学習● これまでのbestの設定で全データ学習を行いました● 全データを使用して学習することでfold-wiseのアンサンブルが出来なくなったため、時系列方向のtime_strideを変更した3モデルを用意しアンサンブルを実行しています○ time_strideを大きくすることで長期的な特徴を獲得し、challenge等の難しいアクションの精度向上が狙い● スコア○ val (3-fold): 0.751 → 0.753○ 各time_strideで3-foldで学習したモデルを使用して算出○ Public LB: 0.768 → 0.78241t-2 t-1 t t+1 t+2time_stride=1t-2 t-1 t t+1 t+2入力フレームt-2 t-1 t t+1 t+2time_stride=2t-2 t-1 t t+1 t+2入力フレームt-2 t-1 t t+1 t+2time_stride=3t-2 t-1 t t+1 t+2入力フレーム
Copyright© Fixstars Group改善毎のスコア推移まとめ● val APの高い2モデルを最終提出42実験ID description model Val AP Public LB Private LB1titoさんのベースラインモデル b5_ap 0.215 0.249 0.2437532+ Test time augmentation b5_ap 0.228 0.255 0.2478923+ ラベルエラーの修正 b5_ap 0.242 0.283 0.2965064+ 前後1フレーム飛ばしの2.5次元画像を使用 b5_ap 0.312 0.425 0.4527675+ 入力画像の解像度を960×540に変更、2フレームごとに推論 b5_ap 0.554 0.563 0.6194316+ loss関数を4クラスBinary cross entropy lossに変更 b5_ap 0.609 0.618 0.6643717+ カスタムデータローダー b5_ap 0.625 0.634 0.6742298+ データ拡張の追加 b5_ap 0.7 0.703 0.7258129+ b5モデルをb0モデルに軽量化、4-foldのモデルアンサンブル b0_ap (4-fold) 0.669 0.72 0.74491110+ 2フレームごとに推論した際に飛ばしたフレームの予測を線形補間で生成 b0_ap (4-fold) 0.686 0.74 0.75578711+ 入力画像の解像度を1280×720に変更、3-foldのモデルアンサンブル b0_ap (3-fold) 0.722 0.772 0.79840712+ Mixupデータ拡張追加 b0_ap (3-fold) 0.747 0.761 0.79976913+ 3つのb0モデルの内、1つをb1モデルに置き換え b0_ap (2-fold), b1_ap (1-fold) 0.751 0.768 0.80256814+ 3つのフル学習b0モデル(各モデルは前後1フレーム、2フレーム、3フレーム飛ばしの2.5次元画像を使用)b0_ap (full-fit, time_stride=1, 2, 3) 0.753 0.782 0.803753
Copyright© Fixstars Groupコンペを通じて得た知見共有43
Copyright© Fixstars Groupコンペを通じて得た知見● Kaggleで過去にあまり開催されていない種類のタスクは金メダルを狙うチャンス○ 定番のタスク(Image classification, Semantic segmentation, Object detection等)においては過去の知見が大量に存在し、ある程度手法が確立されているため、いかに効率よく大量に実験を回し続けるかが勝負のカギになると思われます○ 一方で今回のコンペでは過去の知見があまり無く、単純な試行錯誤ではスコアを伸ばすのは難しい状況だったと思われます。逆に言うと弊社チームのようなワンアイデアでも金メダルに直結するスコアを出せることが分かりました● (既に言い古されていることではありますが) Localの検証がやはり大事○ 今回の改善作業を進める中で早期にLocal環境とPublic LBでスコアの相関を取れたので、とてもスムーズに改善作業を進めることができました44
Copyright© Fixstars Groupまとめ● Kaggle DFLコンペで6位を獲得した解法を紹介しました● 最終解法に至るまでの各実験で取り入れた改善手法について具体的な手法と採用理由についても解説しました● 今後画像系コンペに参戦される方のスコアアップの参考になれば幸いです45
Copyright© Fixstars GroupThank you!お問い合わせ窓口 : [email protected]46