宗教画テーマの分類

この絵には何が書かれている?

賞金: 100,000 参加ユーザー数: 251 約3年前に終了

3rd Place Solution(by Oregin)

1.はじめに

今回の宗教画テーマ分類コンペの3位解法を投稿させていただきます。

ProbSpaceの運営の皆様、共にコンペに参加し、研鑽させていただきました参加者の皆様に感謝を申し上げます。 毎回、コンペを楽しませていただきながら、色々と学ばせていただいています。 以下のブログにも全体像の図解等を掲載いたしましたので、必要に応じてご参照ください。

[【3位解法】ProbSpace開催「宗教画テーマの分類」の振り返り。]https://oregin-ai.hatenablog.com/entry/2021/09/13/232706

2.前処理

今回のコンペは、データの特徴として、訓練データが654枚、テストデータが497枚と、比較的データ量が少ないデータだったので、垂直・水平に反転した画像、回転した画像、セピア色に変換した画像を水増しした訓練データを作成。それぞれの画像の水増し割合を16パターンで学習を実施しました。

データの前処理については、albumentationsというライブラリを利用しました。

【前処理 共通】 こちらは、訓練データ、テストデータの両方に適用する共通の処理です。

  • サイズ変更 albumentationsのResize()を使って、画像サイズの変更を実施。後続の学習済みモデルに合わせたサイズに変更。
  • 標準化
    albumentationsのNormalize()を使って、画素値の標準化を実施。

【前処理 水増し】 こちらは、訓練データを水増しするために実施する前処理です。テストデータには実施しません。

  • 水平反転
    albumentationsのHorizontalFlipを使って、指定した割合の画像を水平反転。
  • 垂直反転 albumentationsのVerticalFlipを使って、指定した割合の画像を垂直反転。
  • 回転 albumentationsのRotateを使って、指定した割合の画像を回転。
  • セピア変換 albumentationsのToSepiaを使って、指定した割合の画像をセピア色に変換。今回のデータでは、古い絵画もあったので、採用してみました。

3.モデル構築

今回は、大きく分けて、学習済みのEfficientNetを活用してファインチューニングを実施する1段目と、多値分類のモデルと、クラスごとの2値分類を実施するモデルを組み合わせた2段目の、スタッキングモデルを構築しました。 【1段目:EfficientNet】 1段目は、EfficientNetの学習済みモデルをファインチューニングし、訓練データの予測値と、テストデータの予測値を出力するモデルを16個作成しました。 それぞれのモデルで、訓練データの水増しの割合を変更することで、パターン分けしました。 このモデルは、skywalkerさんがトピックに投稿してくださっている、EfficientNetB0使ったベースラインも参考にさせていただきました。 https://comp.probspace.com/competitions/religious_art/discussions/skywalker-Post1a375b68565d3d022e6a

【2段目:LighetGBM】 2段目は、16種類の予測値を訓練データとして、多値分類するモデルの予測値に、各分類ごとの2値分類をするモデルの予測値を上書きすることで、精度を上げる方法を実施しました。 この方法は、プロ野球データ分析チャレンジで採用した方法を応用しました。

4.感想

今回のコンペは、宗教画の意味するテーマを分類するコンペでした。 これまで、宗教画をじっくり眺めて、テーマを考えることがなかったので、「あ、この絵のこの部分はこういうことを表しているんだ。」と、モデル以上に自分自身も学習することができました。(笑) 途中、自分が分類する場合に、「十字架があるな」、「人が多いな」などを基準にしたりするので、物体検出が応用できないかと、Yoloにも挑戦してみましたが、なかなか精度は上がりませんでした。

参考:学習済みのYOLOv5による物体検出結果の特徴量への追加 https://comp.probspace.com/competitions/religious_art/discussions/Oregin-Post2a43024f366d7a2a8a05

新しい技術にも触れられて、とても有意義なコンペとなりました。 また、今回からProbSpaceでも、最終提出ファイル選択方式となったので、最後の最後まで、ファイル選びに悩みました。 Public:Privateが13%:87%と、Publicスコアがあまり重視できない割合だったこともあって、ShakeDownしてしまいましたが、何とか3位になることができました。 引き続き、コンペに参加していきたいと思いますので、対戦よろしくお願いいたします。

Icon22
sugupoko

お疲れ様です。 貴重な情報ありがとうございます。

素人的な質問で恐縮なのですが、 OOFとPREDICTIONをLightGBMで学習させる、、、という枠組みは割と一般的なモノなのでしょうか?

申し訳ありませんが、教えて頂ければ幸いです。

Aws4 request&x amz signedheaders=host&x amz signature=6f5ade92e538ff11133bc37e605c43780a73d5a31ecdb6d167efb2f64dfbae4e
Oregin

1段目のモデルで学習した予測値を、2段目のモデルの入力として学習させるという手法は、スタッキングという手法で、精度を上げる際に、よく用いられている手法になります。 概要であれば、以下のサイトなどを参照していただくとわかりやすいと思います。 https://rin-effort.com/2020/02/09/learn-stacking/ また、書籍であれば、「Kaggleで勝つデータ分析の技術 」などをご参照いただけるとよいと思います。 ご参考まで。

Icon22
sugupoko

ご返信、参考URLもご提示して頂きありがとうございます!

今回はone-modelのみの学習までしか行きつかなかったので、 次回以降取り組みたいと思います!

Favicon
new user
コメントするには 新規登録 もしくは ログイン が必要です。