0
0

SIGNATE 超解像度コンペ 6位解法【Axell AI Contest 2024】

Posted at

株式会社アクセルが主催する超解像度化コンペに参加し、最終6位(金メダル)を獲得しました。コンペの参加者は266人でした。

GWbnRgBXEAAk7gH.jpeg

コンペ概要

今回参加したのはSIGNATEにて行われた「Axell AI Contest 2024」というコンペです。
特設サイト:

本コンペは、配布された自然画像データセット(851枚のトレーニングデータ + 100枚のテストデータ)に対して、4倍超解像モデルの精度を競うものでした。開発したモデルは、ONNX形式に変換して提出する必要があります。加えて、リアルタイムでの実用化を目指す背景から、推論時間に以下の制限がありました。

SIGNATEのプラットフォーム上で0.035sec以内に超解像処理を完了させるモデルを必須条件としています。

そのため、Swin2SRといった巨大なモデルは使えません。この制限が非常に面白く、工夫のしがいがありました。

また、評価指標はPSNRが採用されました。

参加のきっかけ

大学院にて画像認識(セマンティックセグメンテーション)を用いた研究をしており、知見をもとに何かのコンペに出たいと思っていたところ、本コンペを見つけました。

解法概要

  • モデル:EDSR
  • 外部データ:
    • DIV2KとFlickr2Kを追加
    • 人が主要な被写体の画像を除外
  • データ拡張:
    • 1-400epoch:水平反転 + 外部データ
    • 401-500epoch:水平反転 (外部データなし)

具体的なコードは以下にて公開しています

解法詳細

モデル

EDSRを採用しました。シンプルで拡張性が高く、パラメータ数を調整しやすいためです。最終的な構成は以下のようになりました。

edsr.png

運営提供のサンプルコードではESCPNを使っていましたが、EDSRを使うことで精度を大幅に向上させることができました。

外部データの使用

本コンペは外部データの使用が認められていたので、DIV2KFlickr2Kを追加しました。
その際、運営より配布されたデータには人が主要な被写体として含まれていなかったため、追加した外部データの調整を行いました。

external-data.jpg

具体的には、YOLOv5を用いて人物検出を行い、画像内における人の占める割合が閾値(今回は0.1)を超える画像を除外しました。これにより、精度向上に繋がりました。

データ拡張

基本的に、水平反転のみ行いました。配布データが標準的な向きの画像だったため、垂直反転は不要と判断しました。
しかし、反省点として、回転は加えた方が良かったと思います。理由は以下の2つです。

  • 検証データ内に90度傾いた画像が2,3枚含まれていた(コンペ中は少量と見なして無視してしまった)
  • DIV2Kなどをのデータセットでも、回転を加えたデータ拡張が一般的である(参考)

また、学習の途中からは外部データを使用せず、配布データのみで行いました。これにより、最後まで外部データを使用した場合よりも精度を上げることができました。

その他

  • 学習率はWarmup付きCosine Annealingでスケジュールしました
  • ONNX形式に変換する際、FP16で保存することで、推論速度をあげました
  • 損失関数はMSELoss(L2誤差)を使いました。L1誤差よりもうまくいきました

うまくいかなかったこと

Wavelet変換

最も期待した改善策でしたが、時間切れもあり、精度向上には至りませんでした。

アイデアの元となった論文↓
ニューラルネットワークを用いた単一画像超解像のウェーブレット変換による高速化

ざっくりまとめると

  • Wavelet変換を用いた画像処理によって、画像は1つの低周波成分と3つの高周波成分に分解される。この時、各成分のサイズは元画像の縦横1/2になる
    Wavelet変換.jpg

  • これをSRCNNモデルに導入すると、高精度化と高速化に繋がったことが報告されている

  • そこでSRCNNより高性能なEDSRで試したところ、Wavelet変換を行う前と同程度の精度を保ちながら、大幅な高速化に成功した

Wavelet変換はPytorch Waveletsというライブラリを使って実装し、先ほどのEDSRに組み込みました。すると、推論時間は短くなったものの、精度は低下してしまいました。また、短縮した推論時間分EDSRのパラメータを増やしても、Wavelet変換なしの精度を越すことはできませんでした。

(モデルのコードを供養しておきます)
https://github.com/Koichi73/Axell-AI-Contest/blob/main/src/models/edwsr.py

CutMix

データ拡張として試したのですが、精度向上に繋がりませんでした。参考にした記事のように衛星画像では有効ですが、今回のデータには異なるエリアが混ざるようなものがなかったため、うまくいかなかったと考えています。

知識蒸留

事前学習済みのSwin2SRを教師モデル、自作のEDSRを生徒モデルとして行いましたが、精度は改善せず、学習が遅くなったので不採用としました。

その他

3位解法

参考にしたサイト(一部掲載)

衛星画像の超解像コンペで1位

精度向上の方法まとめ

論文まとめ

最後に

初めてのコンペで金メダルを獲得でき、とても嬉しいです。コンペ開始まで超解像度については何も知らなかったので、新しいことを学びつつ、楽しく挑戦できました。
これからもkaggleを含めた様々なコンペに参加していきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0