2023弊研コンペ解法Zennxkurozaru🚀2023弊研コンペ解法2023/12/06に公開Python機械学習PyTorchtechはじめに今年度、弊研究室では機械学習コンペが開催されました。いう私も参加しそれなりのスコアを出せたので、後輩たちの後学のためにも自分の解法を解説したいと思います。タスクでまずはじめにやるべきは、生画像を見ることです。本コンペで使用するデータセットの中身を確認すると、やばいデータが大量にあることが確認できます。やばい例こういったあからさまなノイズは学習・識別の邪魔になることが予想されます。そこで、今回は事前に車の領域でクロップしてしまうことにしました。大量の学習・テストデータ全てを手作業でクロッピングしていくのは無理です。物体検出そこで物体検出を使います。物体検出とは画像の中から定められた物体の位置やクラスを検出することを言います。この物体検出技術を用いて、車の領域を検出し、その領域を自動でクロップしたいと思います。今日には様々な物体検出の事前学習モデルが公開されています。今回はYOLOv8を使います。YOLOは公式以外に開発元がいろいろあって各々がバージョンを勝手に付けてるので、どれがどの系列かよくわからないことになってます。最新っぽいのでv8を使いました。https://github.com/ultralytics/ultralyticsクロップの方法ですが、単に検出した領域すべてでクロップしてしまうと、ほぼ同じような領域や車に関係のない領域までクロップされてしまいます。検出した領域の中で一番大きい部分のみクロップするようにしました。一つも検出されなかった場合はその画像のまま用いることにしました。自動クロップの結果が下です。事前学習のモデルでここまで高精度に検出できました。使用したコードは下に載せておきます。img)モデル続いて使用した識別モデルについてです。ここからはコードベースで解説していきます。x識別モデルにはEfficientNetV2-SのIMAGENET_1K事前学習モデルを使用しました。EfficientNetV2は我々Plant班でほぼデファクトスタンダードとなっているつよつよCNNです。self.transforms(image)データ拡張にはRandAugmentとAugMixを使用しました。適用するという手法になります。RandAugment例シンプルながら強力です。グリッドサーチで最適っぽいのを見つけてきます。あたりが良さそうでした。個作成し、それらと元画像をアルファ合成するという手法になります。AugMix例これまた強いです。https://pytorch.org/vision/main/generated/torchvision.transforms.AugMix.htmlhttps://arxiv.org/abs/1912.02781データ拡張例これらのデータ拡張をかけると次のような画像になりました。リサイズと、IMAGENET事前学習時と同様の正規化を行いました。入力サイズに合わせるときにRandomCropやRandomResizedCropなどで行うこともありますが、今回の場合は識別対象(車)とする領域のみが入力されているので、入力全体が入るようにResizeでやったほうがよさそうでした。"./model.pth")長ったらしいのでピックアップしながら解説します。100ここら辺は感覚です。経験則的にこのくらいがいいだろうで決めてます。バッチサイズをできるだけ大きくするために工夫した点が2つあるので、それについては後の項目で解説します。2つ使わない手はないのでDataParallelで並列化しましょう。単純に使えるGPUメモリが増えるのでバッチサイズを大きくできます。Entropyを使用しました。学習データに不均衡性がみられる場合に効果的です。https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.htmlOptimizerにはRAdamを使用しました。一般的に使われている最適化手法のAdamをベースとしつつ、これよりも汎化性能が高いらしいです。https://pytorch.org/docs/stable/generated/torch.optim.RAdam.htmlhttps://arxiv.org/abs/1908.03265SchedulerにはCosineAnnealingLRを使用しました。コサインカーブに基づいて学習率をエポックごとに変化させます。通常float32で行われるPytorchの計算の一部をfloat16で行うシステムです。性能を下げずに、省メモリ化、計算の高速化が可能です。省メモリ化によりバッチサイズを大きくできます。前述のScalerは勾配に倍率をかけるもので、半精度にしたために起こる勾配のアンダーフローを防ぐことができます。https://pytorch.org/docs/stable/amp.htmlテストsubmissionのためのコードも載せておきます。testing!")おわりに以上が私の解法になります。基本的に特別なことはしていなくて、SoTAとなっているような技術を組み合わせただけです。新しい技術を取り入れていくことは研究においてとても重要なので、そういったことを意識しながら研究していくといいモノができるんじゃないかと思います。本記事を見てくださった方、および当コンペを開催してくださった弊研究室の皆様に深く御礼申し上げます。xkurozaruバッジを贈って著者を応援しようバッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。Proよくある質問LinksX(Twitter)GitHubメディアキットLegal利用規約プライバシーポリシ。