A SURVEY ON CONTRASTIVE SELF-SUPERVISED LEARNINGを読む

Inroduction

  • Self-supervised trainingつまり自己教師あり学習についてのサーベイ論文
  • self-supervised learning methods have integrated both generative and contrastive approaches
    • つまり自己教師あり学習は生成的か対照的かと言う手法によって分けられている
  • 表現学習という手法をかんがえるのだが、表現学習の場合、ラフなイメージがあれば十分であるということが脳科学の観点から示されている。

Methodology

  • 表現学習をするための手法はいくつかある
  • color transformation, geometric transformation, context-based tasks, and cross-modal based tasks.の4つ
  • 上の手法を用いえAugumented されたデータを

 

Diffusionモデルを理解する。Diffusion Models: A Comprehensive Survey of Methods and Applicationsを読む

Abstract

  • efficient sampling, improved likelihood estimation, and handling data with special structuresという観点で使いやすい
    • つまり効率的なサンプリング
    • 類似点推定
    • データを特別な形で扱う

Introduction

  • 長らく続いていた画像生成におけるGANの性能を遥かに超えるSoTAを達成した
  • DDPM,SGMs,SDEsという手法を用いて

FOUNDATIONS OF DIFFUSION MODELS

DDPMs

  • DiffsionモデルはDDPMsと呼ばれる手法からなっている
  • A denoising diffusion probabilistic modelと呼ばれる
  • 二つのマルコフ連鎖を使っている。
    • 一つのマルコフ連鎖はForward Processで、データにノイズを加えていく
    • もう一つはReverse Processでノイズからデータを復元する
  • 遷移核は一般的にはこんな感じ。ちなみに遷移書くというのはマルコフ行列の中身のこと
    • 𝑞(x𝑡 | x𝑡−1) = N (x𝑡 ; √︁ 1 − 𝛽𝑡 x𝑡−1, 𝛽𝑡I),正規分布
  • KL Divergenceを用いて計算する

疲れたので今日はここまで

【アウトプット】Probabilistic teacherのコード面の理解

            if entropy_weight:
                if self.cfg.UNSUPNET.MODEL_TYPE == "GUASSIAN":
                    entropy = 0.5 * torch.log(2 * np.pi * np.e * sigma_p)
                    max_entropy = 0.5 * math.log(2 * np.pi * np.e)
                elif self.cfg.UNSUPNET.MODEL_TYPE == "LAPLACE":
                    entropy = 1 + 0.5 * torch.log(4 * sigma_p)
                    max_entropy = 1 + math.log(2)
                weight = (1 - entropy / max_entropy) ** weight_lamuda[1]

Probabilistic Teacherにおけるクロスエントロピーの計算コード

 

box_regressionというコードにガウシアンやらプラシアンなどの計算コードが書き込まれている

 

 

def gaussian_dist_pdf(val, mean, var, eps=1e-9):
    simga_constant = 0.3
    return torch.exp(-(val - mean) ** 2.0 / (var + eps) / 2.0) / torch.sqrt(2.0 * np.pi * (var + simga_constant))


def laplace_dist_pdf(val, mean, var, eps=1e-9):
    simga_constant = 0.3
    return torch.exp(-torch.abs(val - mean) / torch.sqrt(var + eps)) / torch.sqrt(4.0 * (var + simga_constant))


Selfーtrainingとは

擬似ラベル付けのコード

    def process_pseudo_label(
            self, proposals_rpn_unsup_k, proposal_type, psedo_label_method=""
    ):
        list_instances = []
        num_proposal_output = 0.0
        for proposal_bbox_inst in proposals_rpn_unsup_k:
            # all
            if psedo_label_method == "all":
                proposal_bbox_inst = self.threshold_bbox(
                    proposal_bbox_inst, proposal_type=proposal_type
                )
            else:
                raise ValueError("Unkown pseudo label boxes methods")
            num_proposal_output += len(proposal_bbox_inst)
            list_instances.append(proposal_bbox_inst)
        num_proposal_output = num_proposal_output / len(proposals_rpn_unsup_k)
        return list_instances, num_proposal_output

この中の

threshold_bbox

に着目すると、

 

これは

    def threshold_bbox(self, proposal_bbox_inst, proposal_type="roih"):
        if proposal_type == "rpn":
            # ------------ >all -----------
            # create instances containing boxes and gt_classes
            image_shape = proposal_bbox_inst.image_size
            new_proposal_inst = FreeInstances(image_shape)

            # create box
            new_bbox_loc = proposal_bbox_inst.proposal_boxes.tensor
            new_boxes = Boxes(new_bbox_loc)

            # add boxes to instances
            new_proposal_inst.gt_boxes = new_boxes
            new_proposal_inst.objectness_logits = proposal_bbox_inst.objectness_logits

            # ------------ <all -----------
            # create box
            new_bbox_loc = proposal_bbox_inst.proposal_boxes.tensor
            new_boxes = Boxes(new_bbox_loc)

            # add boxes to instances
            new_proposal_inst.pseudo_boxes = new_boxes

        elif proposal_type == "roih":

            # ------------ >all -----------
            # create instances containing boxes and gt_classes
            image_shape = proposal_bbox_inst.image_size
            new_proposal_inst = FreeInstances(image_shape)

            # create box
            # new_bbox_loc = proposal_bbox_inst.pred_boxes.tensor
            # new_boxes = Boxes(new_bbox_loc)

            # add boxes to instances
            # new_proposal_inst.gt_boxes = new_boxes
            # new_proposal_inst.gt_classes = proposal_bbox_inst.pred_classes
            # new_proposal_inst.scores = proposal_bbox_inst.scores

            # ------------ <all -----------
            new_bbox_loc = proposal_bbox_inst.pred_boxes.tensor
            pseudo_boxes = Boxes(new_bbox_loc)

            # add boxes to instances
            new_proposal_inst.pseudo_boxes = pseudo_boxes
            new_proposal_inst.scores_logists = proposal_bbox_inst.scores_logists
            if proposal_bbox_inst.has('boxes_sigma'):
                new_proposal_inst.boxes_sigma = proposal_bbox_inst.boxes_sigma

        return new_proposal_inst

というコードであると書かれている。同じコード内にある
torch.no_gradはテンソルの勾配計算を無しにするもの

 

ここで
self.model_teacher(unlabel_data_k, branch="unsup_data_weak")

これを代入してUnlabelに擬似ラベルを付与している。さらに辿る

 

これを辿るとBuildモデルにたどりつく。したがってModelingというフォルダを変更するのが重要

Torch.cat。テンソルを連結

【アウトプット】Learning Domain Adaptive Object Detection with Probabilistic Teacherを読んだ

Abstract

  • Self-trainingの教師なしドメイン適応能力は、擬似ラベルの品質に左右される
  • Uncertainty-guidedな方法としてEntropy Focal Lossを使って計算することにより、従来の方法を超えるAP値を叩き出した

Introduction

  • ドメインシフトによって、APの値が極めて如実に低下する現象が起こっている
  • そのため教師なしドメイン適応の需要が増加している
  • Unsupervised Domain Adaptive Object Detection
    • Unbiased Mean Teacher、SimRODと呼ばれる手法はSelf-trainingの方法の一つである。
    • 従来の手法では擬似ラベルを得るということに主眼を置いているが、擬似ラベルというものはそもそもとしてNosiyなものになるという可能性を忘れている
    • PTでは擬似ラベルが
  • Self training
    • 半教師あり物体検出(Semisupervised)において発展してきた手法
    • STACと呼ばれる手法では、数少ないLabeled DataをDetecterに学習させる
      • しかしSTACでは一度生成された擬似ラベルは常に固定されており、学習プロセスの間ずっと一緒であるという問題点がある
    • Soft teacherでは、Box jitter methodと呼ばれる手法を利用してLocaliztation accuracyを上昇させようとする手法である
    • LabelMatchでは擬似ラベルをLabel Distribution Consistency(?)を用いて閾値のアップデートを行うという手法をとっている
  • Preliminary
    • PTではFaster-rcnnのディラックデルタ関数によってLocalizationの不確実性を反映できないという問題点を解消し、カテゴリーとLocalizationが確率分散で表示されるようにした

テーマが見つかったのでここまでとする

読んだもの

pyimagesearch.com