こんにちは。
2021年9月23日から2022年1月14日まで開催されていたPetFinder.my - Pawpularity Contestに参加してきました。
結果は3,537チーム中の2位で金メダルを獲得することができました。
今回は自分が取り組んだことや考えたことについて少し書いていこうと思います。
今回の2位という結果に関してはチームメンバーにつれてきてもらったと思っています。ソリューションはkaggleのディスカッションに投稿されてますのでそちらをご参照ください。
tkmさんが本コンペの動画も上げていらっしゃいますので是非ご視聴ください。
コンペ概要
犬と猫の写真のPawpularityスコア(かわいさ?魅力?)を予測することで、写真の魅力を判断するモデルの構築。より魅力的な写真を設定することでペットのプロフィールのページビュー増加につなげたい。
CNNとVision Transformer(とNN)
私が参加したとき公開ノートやディスカッションを見るとswin transformerが主流の様子でした。チームを組んだときもメンバーはswinを中心に実験とスコアの更新をしていました。
今画像タスクをする場合は大きくCNN系(efficientnetとか)、transformer系(swinとか)、NN系(MLP mixerとか)のモデルがあるので組み合わせたアンサンブルは伸びるのかを確認することにしました。
簡単にeffnetとswinを比較してやはりswinのほうがよさそうだと確認した後にcnnを模索しはじめます。
結果としてeffnetはうまく学習させられませんでした。MLP Mixerは比較的いいCV出せましたが最終的に足を引っ張っちゃって採用はされず・・・
よくCNNは局所的(Local)な特徴、ViT系は(Global)な特徴を見るような話を聞きますが、本タスクは人間が見て反応するかどうかがターゲットに関わってくるということもありViT系のモデルが強いのではないかなと思いました。(MLP系は何系に強いのでしょうか?CV最前線を読む限りViT側のタイプな気がしますが・・・)
augmentation
結論はナニモワカランですが、上述したように人が見てどう感じるかがターゲットの値に関わってくる(とおもってる)ので完全に印象が変わるVerticalFlip
を使うのをやめました。また、SNSだとサイドとかコントラスト上げとけば受けが良いみたいな所あるんですけど、同様にサイドやコントラストをいじるAugmentはターゲットの値かわってくるのでは?と思ってColorJitter
も外しました。左右の反転や軽微な回転のみの軽いaugmentationにしました。
小さめなモデルでaugmentationをsoftなものにしたところCVが0.18改善しました。
ただ、大きいモデル途中までハードにAugmentationして、後半にソフトにAugmentation、最後にAugmentation無しでやったものもいい感じだったので、Augmentationは軽くするのが正解なのか良くわかりません。
チームマージしてアンサンブル
マージして3人チームになって、お互いのサブをアンサンブルしたら銀まで伸びました。基本的にはVit系のモデルを時間が許す量使うものだったと思います。
このあともじわじわと各々のCVを伸ばしはするものの上とのスコアの差は大きくなにか見つけなきゃアンサンブルも頭打ちだねという状態でした。
見つかる(見つけてもらった)
弊チームソリューションの 2nd-stage GBDT modelが刺さったときです。
ここからLGBMで効く特徴を見つけていく事になりギアが上がりました。
sub task
前回コンペのBreed1が効くということで、Breedを予測するモデルやmixed_breedかどうかの2クラス分類などのモデルを作って見ましたが効くことはありませんでした悲しい。
結局NaNはNaNでいいみたいな感じ・・・
また、並行でいろいろ試していたnfnet-f3が(かなり重いけど)CNNの割にいい精度を出し、最終モデルにも組み込んでもらえました。
その他試したこと
- Yolo
- yoloを使ってiscatだったり、isdogの特徴、検出された物体の大きさや確信度は全く効きませんでした。
- 100を学習しない
- 100はクリッピングされてそうなので学習データから覗いてみましたがそれもまた意味がなかったです。
- backboneの重みの固定やbnの固定
etc...
最後に
今回金を取ることができてマスターまであと銀以上1枚になりました。早くなりたい思いはありますが、狙って頑張れば銀を取れるほど実力があるとも思ってないので、驕らずに次のコンペも頑張っていきます。