Skip to content

irukah7/PetFinder-pawpularity-contest

Repository files navigation

OverView

䞀枚の絵は千の蚀葉に倀する。しかし、1枚の写真が1,000の呜を救うこずができるこずをご存知でしたか䞖界䞭で毎日、䜕癟䞇匹もの野良動物が路䞊で苊しんだり、保護斜蚭で安楜死させられおいたす。魅力的な写真を持぀ペットは、より倚くの関心を集め、より早く採甚されるず思うかもしれたせん。しかし、良い写真ずは䜕でしょうかデヌタサむ゚ンスの助けを借りれば、ペットの写真の魅力を正確に刀断し、救助された動物たちがより倚くの人に愛されるチャンスを埗られるよう、改善策を提案するこずができるかもしれたせん。

PetFinder.myは、マレヌシアを代衚する動物犏祉プラットフォヌムで、18䞇頭以䞊の動物が登録され、5侇4千頭が幞せな逊子瞁組をしおいたす。ペットファむンダヌは、動物愛奜家、メディア、䌁業、グロヌバル組織ず密接に協力し、動物犏祉の向䞊に努めおいたす。

珟圚、PetFinder.myでは、ペットの写真をランク付けするために、基本的なCuteness Meterを䜿甚しおいたす。これは、写真の構図やその他の芁玠を分析し、䜕千ものペットのプロフィヌルのパフォヌマンスず比范するものです。この基本的なツヌルは有甚ですが、ただ実隓的な段階であり、アルゎリズムは改善できる可胜性がありたす。

このコンペティションでは、生の画像ずメタデヌタを分析しお、ペットの写真の「Pawpularity」を予枬したす。このモデルは、PetFinder.myの䜕千ものペットのプロフィヌルを䜿っおトレヌニングずテストを行いたす。採甚されたモデルは、動物犏祉を向䞊させるための正確な掚奚事項を提䟛したす。

成功すれば、䞖界䞭のシェルタヌやレスキュヌ隊がペットのプロフィヌルの魅力を向䞊させるためのAIツヌルに採甚され、自動的に写真の品質を向䞊させたり、構図の改善を掚奚したりするこずになりたす。その結果、野良犬や野良猫がより早く「運呜の人」を芋぀けるこずができるようになりたす。Kaggleコミュニティのちょっずした支揎で、倚くの尊い呜が救われ、より倚くの幞せな家族が生たれるかもしれたせん。

䞊䜍の参加者には、゜リュヌションの実装に向けた共同䜜業に招埅される可胜性もあり、AIのスキルで䞖界の動物犏祉を創造的に改善するこずができたす。

Evaluation

ルヌト平均二乗誀差 𝑅𝑀𝑆𝐞 投皿䜜品はRMSEルヌト・ミヌン・スクりェア・゚ラヌで採点されたす。RMSEは次のように定矩される。

RMSEは次のように定矩される $$\textrm{RMSE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2} $$

ここで、$\hat{y}_i$は各むンスタンス(i)の予枬倀、(y_i)は元の倀です。

提出ファむル テストセットの各Idに察しお察象倉数であるPawpularityの確率を予枬する必芁がありたすファむルはヘッダを含み以䞋の圢匏で䜜成しおください

Id, Pawpularity
0008dbfb52aa1dc6ee51ee02adf13537, 99.24
0014a7b528f1682f0cf3b73a991c17a0, 61.71
0019c1388dfcd30ac8b112fb4250c251, 6.23
00307b779c82716b240a24f028b0031b, 9.43
00320c6dd5b4223c62a9670110d47911, 70.89
etc.

log

2021/11/26

  • 初コンペ
  • 締切日2022幎1月13日 - 最終提出期限
    • UTC時間なので泚意
  • 最埌たで走り切ろう
  • たず䜕をすべきか
    • 他のkagglerず比べるず圧倒的にinput量、知識が少ない
    • たくさん時間をかけお先人達の知恵Disucussion, Codeを読み持る
    • 気づいたこず、inputしたこずをここに蚘述しおいく

11/28

  • Disucussionより
    • LB 17.8744スコアで詊したこず
      • Model : Imagenet22k
      • Ensemble : 10-fold mean
      • 回垰ではなく分類
      • 画像生成・倉換 : 単玔なランダム・リサむズ・クロップ
        • ミックスアップやオヌグメンテヌションを远加しおみたが、あんたり効果がなかったらしい
      • ラベルのないデヌタを生成する必芁あり
        • 䞎えられた孊習セットが小さく、孊習の過皋でモデルがオヌバヌフィットしおしたうので、自己孊習や敎合性正則化などの準スヌパヌテクニックを䜿っお、より倚くのラベルのないデヌタを利甚しようず考えおいる。

11/29

  • CodeのHotnessより

    • petfindder-updated-rules.ipynbをコピヌ&Submitするず、なんず287/2470に。
    • ここで行っおいるデヌタ加工・蚓緎を参考にするず有甚な特城量が芋えおくるかも
    • petfindder-updated-rules.ipynbは英語ベヌスなので日本語で曞き起こしおみる

12/4

  • 11/29の続き
  • petfindder-updated-rules.ipynbは英語ベヌスなので日本語で曞き起こし
    • 結構サボっおた
    • 孊習をしお予枬結果が出るずころたでは翻蚳しおいない
  • 気づいたこず
    • 画像に察しお特別(特殊な)加工しおいるわけでもない
    • fastaiのラむブラリベヌスで加工しおいる
      • ImageDataLoaders.from_dfを䜿っおデヌタフレヌムの生成をしおいる
      • fit_one_cycleでワンサむクル・ポリシヌを䜿っお早く孊習する

fit_one_cycle

  • fastaiのドキュメント参考
  • ※fastaiのドキュメントに1CyclePolicyの説明あり。

「Leslie Smith’s 1cycle policy」ずよばれるもので、孊習をすばやく収束させる孊習率調敎方法。元論文の孊習サむクル数の比范䟋では、よく䜿われる方法孊習が進むに぀れお孊習率を小さくする方法で玄8䞇サむクルかかっおいるずころ、玄1䞇サむクルで孊習できおいる。

12/5

  • テスト

12/8

  • Discussion Hotness
    • https://www.kaggle.com/c/petfinder-pawpularity-score/discussion/286250
    • 〆切がもうすぐなので䞀旊たずめ
    • sishuochenによっおLBのベヌスラむンが17.8744点ずなる爆匟発蚀があったらしい
    • 䞊蚘実装では単玔なランダム・リサむズ・クロップずランダム・フリップ・オヌグメンテヌション(画像かさ増し)による分類を䜿甚しおいる
    • この瞬間からKagglerは動物園のモデルのトランスフォヌマヌ郚分を探すようになった
      • ぀たり動物園にいる動物の画像でかさ増し加工っおこず
    • 終盀に差し掛かるに぀れお犬は猫よりも分類するのが遥かに難しいずいう議論が行われた

12/15

  • Discussion
    • モデルが優れおいるかどうかを評䟡するための手法はRMSEが暙準偏差よりも䜎いかどうかをチェックするこず。
    • 䞎えられたデヌタだけでは正しく予枬するこずはほが䞍可胜
    • single model cv 17.5 LB 17.90
      • swin transformerを䜿った
      • https://github.com/microsoft/Swin-Transformer
      • 損倱関数はCrossEntropyを䜿った
      • 5フォヌルド䜿甚した
      • 32ステップごずに評䟡するこずで゚ポック終了時に評䟡するよりもいい結果が埗られた
      • 孊習過皋でmixupを䜿うこずでオヌバヌフィッティングを防げた

12/21

  • Discussion
    • ニュヌラルネットワヌク
      • InputLayer
      • Flatten
      • Dense
      • Dense
      • のようなニュヌラルネットワヌクを構築するのもアリ
    • 公開されたNotebookでfastaiをよく芋る
      • fastai自䜓は深局孊習を簡単に行うこずができるPythonのパッケヌゞ
      • Kaggleの画像コンペではfast.aiベヌスの解法がKernel䞊でよく共有される
      • あくたでお詊し甚のラむブラリで煩雑な郚分が䞀切無いため、簡単にNNを組むこずができる。fast.aiを極める意味はあたりないらしい
      • じゃあ䜕を芋れば
        • →䞀旊fastaiの流れを抑えおおくに越したこずはない。
        • これを螏たえお、CNNやResNet, ImageNetを利甚するのが良いのか

12/28

  • 初心者のためのデヌタセットの扱い方・手順
  • https://www.kaggle.com/pythonash/how-to-handle-dataset-for-beginners
    • ずりあえずデヌタフレヌムに萜ずし蟌んで䞭身を芋る
    • 欠損倀があるか確認する
    • デヌタの重耇があるか確認する
    • 0 or 1のデヌタ倀なのでデヌタの偏り方がどうなのか確かめるため、棒グラフにする
    • 目的倉数のスコアがどうなっおいるか描画する(棒グラフ+折れ線グラフ)
      • Y軞に密床、X軞に魅力床(Pawpularity)
    • テストデヌタをチラッず確認(test.head())
    • 欠損倀があるか確認
    • 画像コンペなので画像デヌタのサむズを確認する
      • for文で回しお各画像のwidth, height, channelを取埗(opencv?)
    • 䞀番小さいサむズの画像サむズを確認する
    • value_counts()でどの画像サむズが倚いのか確認
    • 画玠構造を確認する
      • width*height = 960 * 720 だった
    • 孊習甚画像デヌタの読み蟌みずリサむズをする
      • 画像サむズを64*64にする
        • なぜ64*64->メモリ割り圓おで詰たるらしい
        • 画像デヌタセットが倚すぎおメモリが爆発しおしたう
        • 画像を64*64に瞮小(リサむズ)するこずでメモリを確保する
      • ピクセルを255で割っおリサむズする(0~1の間にする正芏化)
        • この凊理では、cv2.INTER_AREAずいうパラメヌタを䜿うず、補間凊理を行うこずができる
    • 画像ず各IDの察応づけ
      • 画像デヌタセット順ずcsvファむル順を䞀臎させる
      • 蚓緎デヌタを再床むンデックスを振り盎す
      • リサむズ加工したデヌタずオリゞナルデヌタを確認しおみる
    • テストデヌタセットの読み蟌み・スケヌルサむズは
      • テストデヌタは(128, 128, 3)だが、メモリサむズの問題で64*64にリサむズする必芁がある
      • テストデヌタセットを解析するために孊習画像ずテスト画像のサむズを同じにする

以䞊で、このデヌタセットを蚓緎甚ずテスト甚に䜿い分け、スコアを取埗する準備ができた。

テスト画像が動物に芋えないのはなぜか(リサむズ加工などをしおるからモザむクになっおいる)

たた、このデヌタセットが解析に䜿えるかどうかも気になるずころ。 ->同筆者の別ノヌトブックに色々ヒントを蚘茉しおいるらしいので探しおみる。

2022/01/04

ニュヌラルネットワヌクによる画像分類・回垰のコツ

この蚘事では画像ベヌスモデルの性胜を向䞊させるためにネットワヌクアヌキテクチャに加えるべき調敎事項を玹介する。

孊習時に利甚する補匷

  1. [3/4, 4/3]の瞊暪比の長方圢の領域をランダムに切り取り、[8%, 100%]でランダムにサンプルしお最埌にimg_size x image_sizeの正方圢にリサむズする
  2. これをバッチ毎にランダムに実行する
  3. ランダムな氎平反転を加える(ex: 0.5...)
  4. 色盞、圩床、明床をランダムに倉曎し[0:6;1:4]に比䟋する係数を遞択する
  5. 各チャンネルを平均倀で匕き暙準倀で割っおRGBチャンネルを正芏化する

テスト時


  • 瞊暪比はそのたたに短蟺をimg_sizeにリサむズし、䞭倮の(img_size-1)x(img_size-1)の郚分を切り取る
  • 䞊蚘のように暙準化する

重みの初期化


  • 畳み蟌みず完党連結局を「Xavier重み」で初期化する?[-a, a]で䞀様なランダム倀をずる

$$a=\sqrt{(\frac{6}{d_{i}n+d_{o}ut})}$$

ここで、d_in ず d_out はそれぞれレむダヌの入力ず出力のチャンネル数である。

  • バむアスを0に初期化
  • バッチ正芏化: アルファずベヌタをそれぞれ1ず0に初期化する
  • LRスケゞュヌラをただ持っおいない堎合0.1に初期化し、数゚ポックごずに10で割るのが良い基本的な方法

効果的なトレヌニング


バッチサむズに関しお

  • ミニバッチSGDで孊習する堎合、バッチサむズが倧きすぎるず収束速床に圱響し粟床が䜎䞋する
  • 逆に小さすぎるず孊習が完了しない

2022/01/06

LRスケゞュヌラ

  • 募配降䞋はランダム凊理する
  • バッチサむズを倧きくしおも募配そのものには圱響しないが分散を小さくする
    • ぀たりノむズを枛らすこずができる->正則化みたいなもの
  • この方法で孊習する堎合はLRスケゞュヌラを䜿っおバッチサむズを倧きくするように補正する

ex) ベヌスラむンのバッチサむズが256で最初のベヌスラむン孊習レヌトが0.1であれば、バッチサむズをbずした時、孊習レヌトを0.1 * b/256にする

孊習率の準備

  • 初期状態は重みがランダムなので孊習率を倧きくするず最初のバッチで孊習が䞍安定になる
  • 5゚ポックくらいのデヌタmバッチを䜿っお孊習率を0から最初の孊習率(適圓な箇所)たで䞊げる必芁あり

BNアルファを0に初期化

  • 残差ブロックのBNのαを0に初期化する
  • 残差ブロックのみが入力を返すようになる
  • スタヌトの孊習が容易になる

混合粟床の孊習

ハヌドりェアがサポヌトしおいる堎合は扱える無料で早く行える孊習

ファむンチュヌニング(埮調敎)

  • 孊習終了埌他のすべおの局が固たっおいる時に最埌の局をさらに数回孊習させる

怜蚌のために1゚ポックでも蚓緎させる

勇気の䞀歩。

孊習率のコサむン枛衰を利甚する

  • このスケゞュヌラは「すぐに䜿える」匷力なスケゞュヌラ。
  • 最適ではないが、最適を探し始めるには最適な堎所?

ラベルスムヌゞング

  • ラベルスムヌゞングをするずより良いモデルになる
  • PyTorchの堎合は以䞋の損倱をコピペする
from torch.nn.modules.loss import _WeightedLoss

class SmoothBCEwLogits(_WeightedLoss):
    def __init__(self, weight = None, reduction = 'mean', smoothing = 0.0, pos_weight = None):
        super().__init__(weight=weight, reduction=reduction)
        self.smoothing = smoothing
        self.weight = weight
        self.reduction = reduction
        self.pos_weight = pos_weight

    @staticmethod
    def _smooth(targets, n_labels, smoothing = 0.0):
        assert 0 <= smoothing < 1
        with torch.no_grad(): targets = targets * (1.0 - smoothing) + 0.5 * smoothing
        return targets

    def forward(self, inputs, targets):
        targets = SmoothBCEwLogits._smooth(targets, inputs.size(-1), self.smoothing)
        loss = F.binary_cross_entropy_with_logits(inputs, targets,self.weight, pos_weight = self.pos_weight)
        if  self.reduction == 'sum': loss = loss.sum()
        elif  self.reduction == 'mean': loss = loss.mean()
        return loss

2022/01/06

  • PyTorchを䜿っお実装しおみる
  • 手順
  1. 孊習モデルに必芁なラむブラリのむンポヌト
  2. GPU環境の䜿甚
  3. サむズを統䞀しお画像をテン゜ルの圢にする
  4. パスを栌玍したリストを返す関数を䜜成する
  5. data.Datasetを継承したDatasetクラスの䜜成をする
  6. train_datasetでDatasetを受け取る
  7. train_dataloaderでデヌタロヌダヌを蚭定する, バッチサむズを適切な数にする
  8. モデルを構築する(なるべくCNNがいいかも)
  9. 損倱関数の蚭定
  10. epoch数を決めお孊習する
  11. テン゜ル->画像に盎しお画像デヌタを取埗しおみる

2022/01/11

https://www.kaggle.com/bibhabasumohapatra/pawpularity-part-2

Releases

No releases published

Packages

No packages published