【アウトプット】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
この中の
に着目すると、
これは
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_boxeselif 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_sigmareturn new_proposal_inst
というコードであると書かれている。同じコード内にある
torch.no_gradはテンソルの勾配計算を無しにするもの
ここで
self.model_teacher(unlabel_data_k, branch="unsup_data_weak")
これを代入してUnlabelに擬似ラベルを付与している。さらに辿る
これを辿るとBuildモデルにたどりつく。したがってModelingというフォルダを変更するのが重要
Torch.cat。テンソルを連結