古来の絵巻物/絵本の画像から、登場人物の身分を推測しよう!
newduck
皆様、お疲れさまでした。
効いた・効かなかった解法を議論できればと思いますので、是非、皆さんのアイデア・コメント等も教えて頂ければと思います。なお私の解法は、PROBSPACEの過去コンペ「宗教画テーマの分類」の1位解法、anooさんのものを参考にしたのですが、途中で力尽きました。参考:https://comp.probspace.com/competitions/religious_art/discussions/anoo-Post43902e99c081b1fbc676最高スコアはLB0.874、シングルモデルでの最高スコアはLB0.865(Swin Transformer,pseudo labeling,水平反転のみのaugmentation)でした
--■今回スコアに効いたと思うもの ・Swin Transformer ・pseudo labeling ⇒複数のモデルでAugmentationしたファイルの有/無等の条件を変え5つの予測ファイルを作り、5つの判定結果が一致する1406枚でpseudo labelingとしました。
■やったけどスコアに効かなかったもの ・特に無(強いて言えばalbumentationのShiftScaleRotate) ■あまり取組めなかったもの ・アップサンプリング・ダウンサンプリング 4つのラベルのサンプル数に明かな差があるので、何か対策を打つべきと考え、3のラベルについてAugmentation(水平反転のみ)を加えましたが、あまり対策できませんでした。 ⇒単純に画像を削除してしまうダウンサンプリングが効くのが一番試したかったのですが、、、 ・Augmentation albumentationを利用したのですが、水平反転とShiftScaleRotateのみ試し、後者はあまりスコアに効かなそうなので前者のみ使いました。 ⇒垂直反転や回転等含め他の効果は効き目があったのか気になっています。 ・TTA(実装できず) ・判定が難しい画像への個別対応 手元の計算結果や上位の方のスコアを見ていると恐らく数十枚程度は、判定が難しい画像があるのかと思われました。 そこで、何かそれらに特徴的な部分(例えば、「基本情報」で記載のあった引目鉤鼻の検知や、ある特定の色が占める割合等)を見出して判別する個別対応のコードがあると良いのかと思いましたが、実装はできませんでした。 ・ラベル2の画像の判定 Orejinさんの投稿で「クラス2は、特徴的な絵になっています。」と言うコメントがあったのですが、確かにそう見えたので、何かこれを特定してしまうコードが書ければラベル数を4つから3つへ減らすことができるかとも思ったのですが、流石にそこまでは難しいでしょうか、、、、 ・評価指標 今回の痛恨のポイントだったのですが、swin transformerのメトリックでMacro-F1の実装が間に合わず、pseudo labelingで使っていたaccuracyで実装・提出としてしまいました、、、、 (ところで、評価指標の数式ですが、kが0から7までとなっていますが、今回はクラスは4つですのでKは0から4までで、実は1/8ではなくて1/4で割るのではないかと思ったりもしました。)
それでは皆様、効いた解法、効かなかった解法、コメント・アドバイス、是非教えて頂ければと思います。
議論の場を提供していただきありがとうございます。今回初めてPROBSPACE様のコンペに参加しました。
【効いた】・transforms.RandomRotation(degrees=30)・ダウンサンプリング・Squeeze-and-Excitation
【効かなかった】・ResNet系
【取り組めなかったアイデア】・VAEやGANを利用したアップサンプリング・対照学習(contrastive learning)・Transformer系やMLP系
皆さま、お疲れさまでした。
yatarouさん、コメントありがとうございます。
・ダウンサンプリング が効いたと言うのは試してみれば良かったと思いました ⇒どの画像を減らすべきかの基準が分からず、また直感的に減らす方向には踏み込み難く
・完全な同条件の比較ではないですが、私の実装でのTop-1 val accでの評価では10分程度の学習と言う条件で、 Swin Transformer(0.843) > efficientnet(0.777) > ResNet(0.622)/vit(0.677) と言う具合でした ⇒あるサンプル(今回は日本画)に対してどのモデルを選ぶべきかの方針ってあるのか分からず手探りでした
・GANで画像生成は最近色々見ますが、アップサンプリングに使った方はいるんでしょうかね???
共有ありがとうございます。テストデータに同一人物と思われる画像が複数枚あったので、pseudo labelingが効いたように思います。
【効いた】・モデル ・Swin-V2, ViT・Augmentation ・顔でOverfitしている可能性を考えて、画像中心を黒塗り(被っているものや髪型などの周辺情報を重視したい)・背景の色でクラスタリングを実施しStratifiedKFoldで分割したモデルもensemble ・どの絵巻物に描かれているか、という情報が背景に出ているのではという目論見です・Pseudo Labeling ・クラス予測確率が0.95以上のものを選別(1600枚/2000枚)
【効かなかった】・ConvNext系のモデル・MixUp
skywalkerさんコメントありがとうございます(5位おめでとうございます)実は宗教画の際も、今回も、skywalkerさんが宗教画の際に公開していたベースラインも使っていました。confusion_matrixまで表示されて分かりやすく、使い勝手の良いコードだと思います。
・画像中心を黒塗りこれは「引目鉤鼻」を消してしまう方向なのに効いたと言う点で面白いと思いました。
今回のコンペでは私の場合は、DataAugmentationはほとんど効かなかったです。Mixupを使うとCVが悪化しましたが、CutMixだとCVへの影響はないように見えました。
画像サイズを大きくしてもCV向上が見られないのも気になりました。
単体モデルの性能だとPseudoLabeling+EfficientNetV2-Lが最も良かったですが、最終モデルではPseudoなしの別モデルの方がCV, LB, PBが良かったです。(ほぼCV=LB=PBとなりました。)
yoyoyoさんコメントありがとうございます(4位おめでとうございます)
・Mixupが効かないはskywalkerさんも指摘されていますね。⇒ラベル2(incarnation)以外は、絵柄が似ていると思い、どういうDataAugmentationなら効くのかは興味があります。
上記のコメントですと、最終モデルはDataAugmentationもPseudoLabelingも無で高いスコアと言うことなのかと想像しますが、どういう工夫だったのか気になりました。
共有ありがとうございます。皆様お疲れさまでした。
私の場合では、ベースは、skywalkerさんの宗教画データの分類で提供されていたものを使用させていただきました。https://comp.probspace.com/competitions/religious_art/discussions/skywalker-Post1a375b68565d3d022e6a
そこから、DataAugmentationについては、いろいろ試した結果、RandomErasing、IAAPerspectiveが有効だったきがします。あと、Mixupを多用してしまったためか、CVとLBが安定しませんでした。(最終的には、シングルモデルでLB0.912(終了後LB 1 位)がでてましたが、上記理由で選択できませんでした)
モデルは、efficientnet_b0オンリーで、バッチサイズと、エポックを振って複数モデルを作成しました。
それらからLBが高いものを選択して、最終的には単純平均して提出しました。
stackingとblendingも試しましたが、逆効果となり採用しませんでした。
終盤でPseudo Labelingの記載があり、試したかったのですが時間切れでした。
Shojiさんコメントありがとうございます(3位おめでとうございます)
DataAugmentationに注力し、モデルやアンサンブルはシンプル、Pseudo Labelingは無で3位、また終了後LBで1位のモデルがefficientnet_b0ベースと言うのは結構驚きでした。
参考になりました。
以下に書き直しました。https://comp.probspace.com/competitions/kaokore_status/discussions/Shoji-Postec8759f2b06d00cd97e0
ここにコメント頂いてありがたく思っていますが、上位の方は是非、トピックを立てられて詳細解法やコードの公開もご検討頂ければと思います。
もう少しだけ別の議論になりますが、今回、ラベル毎の絵の枚数の差は大きいものでした([ラベル0:3013枚, 1:2201枚, 2:619枚, 3:613枚])
上記の図は、前述のskywalkerさんのサンプルコードでefficientnetを用いてdebugモード(2folds, 2Epocs)で回してみた際の混同行列ですが、上がオリジナルのままの枚数(計6446枚)です。ラベル0が多いせいか、predict(横軸)がラベル0側に寄っていて特にラベル3の予測が悪いようでした(OOF_Score: 0.683530)(因みに実行時間は、Google ColabのV100で概ね20分弱でした、P100でも30分はかからないのではと思います)
そこで、まずはラベル3のアップサンプリングを考えたのですが、下が1例で、(学習中ではなく)前処理としてラベル3の画像全てを水平反転して613枚水増しし加えて計7059枚で予測を行ったところラベル2,3の予測が改善し、全体としてもOOF_Score: 0.724543となったので、以後、このデータセットを利用して検証していました。
振返って当初の混同行列を見る限り、ラベル0の画像を捨てた方が良かったのかなあと思ったりもしますが(試せばよいのですが、、、)
--なお、ラベル2も枚数は少ないのに比較的予測が正しいのは絵に独特の特徴(形や色使い)があるからだと思います。