🐱
Pet Finder 2 振り返り②🐶🐱(上位者解法編)
はじめに🐶🐱
少し旬が過ぎてしまった気もしますが、Pet Finder 2の振り返り第2回です。
前回は自分の解法を中心にまとめましたが、今回は上位者解法から得られた学びをまとめました。
前記事
1. 前処理
Center Crop
引用元:6th Solution
- 画像を単純Resizeすると横長の画像、縦長の画像が圧縮されて歪んでしまいます。
- Center Cropをして、歪ませずに正方形に整形することで、CV・LBが大幅に改善したようです。
- 言われてみれば当たり前でしたが、僕はできていませんでした。Data Augumentation後の画像を目視するのは大切ですね。
Data Augumentation
- 今回は224, 384, 512 の画像サイズが使えましたが、画像サイズが大きいほどAugumentationが必要になるようです。
- 6th solutionでは、512にはRandom square crop, Horizontal Flip, Vertical Flip, Transpose, Brightness, Contrast, Hue, Saturation, Rotation, Random Eraseを使用。224 には Random square crop and Flips だけを使用。
- 3rd solutionでは、ColorJitter、RandomAffine、RandomCrop、RandomHorizontalFlip、ラベルスムージングを0.025で実施。
OpenAI CLIP
引用元:1th Solution
- 1st Solutionでは OpenAI CLIPから得られるMetaデータを使用していました。
- OpenAI CLIPのサンプルコードが公開されています。Sleeping dog、PoodleといったYOLO以上の情報が得られるので、いい特徴量が得られそうですね。
2. Model
Beit
- 1st solution, 6th solution ともに best single model は Beit だったようです。
- 6thのChrisさんは
timm.list_models(pretrained=True)
で出てくるモデルを片っ端から試して一番いいモデルを選んだようです。(beit, cait, convit, crossvit, deit, levit, pit, swin, vit, xcit) - この「片っ端から全部試す」精神は見習わないとですね…。
ConvNext
- Part1で触れたので深くは触れませんが、上位解法のいくつかでは採用され、CV改善に貢献したようです。
- 最新のアーキテクチャもしっかり取り込む。それがカグラーの誓いなのだ。
Auxiliary output・Multi-tasking
引用元:6th Solution
- Metaデータをinputではなくoutputに使い、Multi-taskingさせる手法があるようです。
- 今回、犬猫情報をinputとして与えても精度があがりませんでしたが、Outputに加えて犬猫判定もタスクに加えることで、モデル全体が賢くなり、結果的にPawpularityの精度も改善したようです。
モデルの多様性
引用元:6th Solution
アンサンブルではモデルの多様性が重要になります。
6th solutionの方は、その多様性を出すために、以下の点を考慮しているようです。
- change batch size
- change input image size
- change backbone
- use CNN vs. Transformer
- use model pretrained on different original image datasets (1k image vs. 22k imagenet vs. etc)
- use imagenet pretrain vs. noisy-student vs. AP etc etc
- preprocess with square crops to keep aspect ratio vs. squish image into square
- data augmentation
- add meta as input
- add meta as auxiliary target
- change loss from regression, to BCE, to multiclass (put Pawpularity into buckets)
- initialize layers in different ways
- use different activation functions
- do regression with MAE instead of MSE
- have model predict breed as auxiliary
- have model predict dog cat as auxiliary
- use imagenet pretrain model without finetuning it. (Just train a head).
- modify architecture like removing downsampling from first EffNet layer
- make custom head like add spatial attention to CNN etc
- use different pooling, like attention pooling, max pooling, avg pooling, etc
- freeze model batch norms
- freeze different parts of backbone during train
- etc etc
再学習なし+SVR
引用元:1st Solution、1st Solution - Full writeup
- 1st solutionでは、特徴量を取得するためにPretrained modelを再学習させずにそのまま使い、SVRのインプットデータとしていました。モデルを学習させないという発想が突拍子もないと思いましたが、「1kのモデルは恐らく品種情報も持っている」と仮説を立てたそうです。
- 特徴量を抽出後、複数のモデルから抽出した特徴量を横に並べ、どの特徴量が効くかを1つ1つ確かめるHill Climbの手法を用いて最小RMSEを見つけています。
Deep Label Distribution Learning (DLDL)
引用元:9th Solution
- しっかりと理解しきれなかったのですが、ラベルの分布学習ができることで、ラベルの順序性が考慮される手法のようです(?)
- 年齢推定で用いられるようで、今回のPawpularityも年齢に似た順序性があるため採用したようです。
Ordinal Regression
- 公開ノートでは「二値分類にして、BCEWithLossで解く方が回帰よりも精度がいい」という投稿があり、多くの人が二値分類で解いていたように思いますが、18th solutionではSwin一本で、わずか数日で18位にランクインしたようです。すごい。
- Ordinal Regressionについてはコードのどこがそれなのか理解できませんでした。どなたか教えていただけると嬉しいです。
Regularization
MixOut
引用元:9th Solution
- 過学習の抑制のためにMixOutを使っていました。
Optimizer
Ranger21
- 僕はSAMを使いましたが、9th solutionの Tomizawa さんはRanger21を使ったそうです。
- RangerはFastAIは組み込みがしやすいようですね。ただ、Ranger21はPrivate LBでは効いたものの、Public LBが下がったため抜いてしまった人もいるようです。
Ensemble
Hill Climbing
- OOFをベースにCVを最大化するためのNotebookが公開されていました。(https://www.kaggle.com/cdeotte/forward-selection-oof-ensemble-0-942-private)
- 僕は今回のコンペで車輪の再発明をしてしまいましたが、Trust CVをする上でこの手のツールを手元に持っておくのは便利です。
Other tricks
Pet1の重複画像を使う
- 「画像データだけからPawpularityを予測してほしい」というコンペ設計者の思惑を裏切り、Pet1と重複画像を特定し、配布されていないメタデータを活用するという設計の穴を突く解法です。ある意味、Kaggleの醍醐味の1つですね。
- 金メダルを取れる人ならではの閃き力なのだなと感じました。
- とはいえ、1位、3位、6位の方は過去データを使っていないようです。それもかっこいい。
引用元:5th solution ( https://www.kaggle.com/c/petfinder-pawpularity-score/discussion/300928 )
以上です。
上位者解法からたくさん学びが得られました。
振り返りは大事ですね。
Discussion