29 / 204 位(Top20%、Kaggle Silver Medal相当)
内容
目的
与えられた画像から小麦の成長段階を予測するモデルの作成。
評価関数
データセット
画像とそれに対応する成長段階ラベル、ラベルクオリティが含まれているデータセット。ラベルクオリティというのは、成長段階ラベルを決めたのが誰かということ。ラベルクオリティには2種類あり、1
は農家によってつけられたもの、2
は専門家によってつけられたものということを意味している。また、テストデータのラベル付けはすべて専門家によって行われたということが公式からアナウンスされていた。
成長段階ラベルは7段階だが、HQデータ(専門家によってラベル付けされたデータ)には(2, 3, 4, 5, 7
)、LQデータ(農家によってラベル付けされたデータ)には(1, 2, 4, 5, 6, 7
)の成長段階データしかない。また、LQデータの1
と7
のラベルデータはその他のラベルデータと比較して2倍以上多い。
個人的には近しい成長段階の小麦は画像を見ても違いが分からなかった。ただHQデータには白いポールが写っている画像が多いという特徴があり、LQデータのラベル付けの精度はあまり高くなさそうだということはEDAから分かった。
解法
モデル
- ResNet50
- VGG16
- DenseNet201
- EfficientNet-B0
Augmentations
モデルによって使うものは分けた。
- Rotate
- CropPad
- RandomResizedCrop
- Brightness
- CropPad
- Zoom
- Warp
日記
コンペには中盤くらいから参加したので、ベースライン作りのためのソリューションがすでに共有されていたが、fastaiで書かれていたため、まずはfastaiの勉強から始まった。少し勉強したところ、fastaiでも自分がやりたかったことは何となくできそうだったので、モデル作成はfastaiで行うことに。
fastaiにはlearning rateをサジェストしてくれる機能があるが、サジェストに従うよりも自分が決めた値で固定した方が余計なものに振り回されること無くモデルの比較ができると思った。
データに関しては、画像サイズの平均が180 x 512
だったので、リサイズ後の画像が歪になるのを避けるためにそのままリサイズするのではなく、切り抜いてからリサイズすることにした。次に全データ、全HQ+一部のLQデータ(HQデータにない成長段階データをLQデータからデータ数が正規分布の形になるように選択)、HQデータのみの3つのデータセットで試したが、HQデータのみを使用したパターンのスコアが一番良かった。
モデルに関しては、ResNetやEfficientNetなど色々なモデルをfinetuningして得られた各々のスコアと学習にかかる時間を考えて上述の4つのモデルに決めた。
使用するモデルを決めたあとは、Augmentationの方法の調整を行い、それが固まった後はHQデータのみで学習したモデルを使用してLQデータの成長段階を再ラベリングし、HQ+LQデータで新たにモデルを作成したところスコアが改善されたため、このデータセットで学習したモデルをアンサンブルすることで最終スコアを出した。
※ 以下はコンペと関係ないTips
・colabで画像データのzipファイルを解凍する時、colab上の一番上のディレクトリで解凍しないとnotebook上での最初の画像読み込みにかなり時間がかかる。(ホームディレクトリでは読み込みに2分なのに対して作業ディレクトリでは30分)
・googleアカウントを複数作っておくことで、同時に複数のモデルを学習させることができるので、できるだけ活用したほうが良い。ただ、気を付けないとソースコードの管理がめちゃくちゃになる。
上位の解法
1stの特徴
- ResNet50, ResNet101, ResNeXt50
- 最初にHQ+LQデータで学習し、最後にHQデータのみで学習
- 白いポールを画像に追加
効果がなかった方法
- LQデータとテストデータのPseudo labeling
- Mixup、CutMix
- EfficientNet
- 回帰問題として解く
最後に
モデルが何を思って入力画像に対する予測を出したのか分析することが一番大事。そしてそれが一番モデルの改良に繋がる。後はパラメーターとソースコードの管理方法をしっかり学ぶべきだと思いました。