【アウトプット】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。テンソルを連結