|
@@ -84,7 +84,7 @@ class AnchorTargetCreator(object):
|
|
|
argmax_ious[gt_argmax_ious[i]] = i
|
|
|
|
|
|
return argmax_ious, max_ious, gt_argmax_ious
|
|
|
-
|
|
|
+
|
|
|
def _create_label(self, anchor, bbox):
|
|
|
# ------------------------------------------ #
|
|
|
# 1是正样本,0是负样本,-1忽略
|
|
@@ -99,7 +99,7 @@ class AnchorTargetCreator(object):
|
|
|
# gt_argmax_ious为每一个真实框对应的最大的先验框的序号 [num_gt, ]
|
|
|
# ------------------------------------------------------------------------ #
|
|
|
argmax_ious, max_ious, gt_argmax_ious = self._calc_ious(anchor, bbox)
|
|
|
-
|
|
|
+
|
|
|
# ----------------------------------------------------- #
|
|
|
# 如果小于门限值则设置为负样本
|
|
|
# 如果大于门限值则设置为正样本
|
|
@@ -146,7 +146,7 @@ class ProposalTargetCreator(object):
|
|
|
# 计算建议框和真实框的重合程度
|
|
|
# ----------------------------------------------------- #
|
|
|
iou = bbox_iou(roi, bbox)
|
|
|
-
|
|
|
+
|
|
|
if len(bbox)==0:
|
|
|
gt_assignment = np.zeros(len(roi), np.int32)
|
|
|
max_iou = np.zeros(len(roi))
|
|
@@ -183,7 +183,7 @@ class ProposalTargetCreator(object):
|
|
|
neg_roi_per_this_image = int(min(neg_roi_per_this_image, neg_index.size))
|
|
|
if neg_index.size > 0:
|
|
|
neg_index = np.random.choice(neg_index, size=neg_roi_per_this_image, replace=False)
|
|
|
-
|
|
|
+
|
|
|
#---------------------------------------------------------#
|
|
|
# sample_roi [n_sample, ]
|
|
|
# gt_roi_loc [n_sample, 4]
|
|
@@ -230,10 +230,10 @@ class FasterRCNNTrainer(nn.Module):
|
|
|
)
|
|
|
regression_loss = regression_loss.sum()
|
|
|
num_pos = (gt_label > 0).sum().float()
|
|
|
-
|
|
|
+
|
|
|
regression_loss /= torch.max(num_pos, torch.ones_like(num_pos))
|
|
|
return regression_loss
|
|
|
-
|
|
|
+
|
|
|
def forward(self, imgs, bboxes, labels, scale):
|
|
|
n = imgs.shape[0]
|
|
|
img_size = imgs.shape[2:]
|
|
@@ -246,7 +246,7 @@ class FasterRCNNTrainer(nn.Module):
|
|
|
# 利用rpn网络获得调整参数、得分、建议框、先验框
|
|
|
# -------------------------------------------------- #
|
|
|
rpn_locs, rpn_scores, rois, roi_indices, anchor = self.model_train(x = [base_feature, img_size], scale = scale, mode = 'rpn')
|
|
|
-
|
|
|
+
|
|
|
rpn_loc_loss_all, rpn_cls_loss_all, roi_loc_loss_all, roi_cls_loss_all = 0, 0, 0, 0
|
|
|
sample_rois, sample_indexes, gt_roi_locs, gt_roi_labels = [], [], [], []
|
|
|
for i in range(n):
|
|
@@ -269,7 +269,7 @@ class FasterRCNNTrainer(nn.Module):
|
|
|
# -------------------------------------------------- #
|
|
|
rpn_loc_loss = self._fast_rcnn_loc_loss(rpn_loc, gt_rpn_loc, gt_rpn_label, self.rpn_sigma)
|
|
|
rpn_cls_loss = F.cross_entropy(rpn_score, gt_rpn_label, ignore_index=-1)
|
|
|
-
|
|
|
+
|
|
|
rpn_loc_loss_all += rpn_loc_loss
|
|
|
rpn_cls_loss_all += rpn_cls_loss
|
|
|
# ------------------------------------------------------ #
|
|
@@ -284,7 +284,7 @@ class FasterRCNNTrainer(nn.Module):
|
|
|
sample_indexes.append(torch.ones(len(sample_roi)).type_as(rpn_locs) * roi_indices[i][0])
|
|
|
gt_roi_locs.append(torch.Tensor(gt_roi_loc).type_as(rpn_locs))
|
|
|
gt_roi_labels.append(torch.Tensor(gt_roi_label).type_as(rpn_locs).long())
|
|
|
-
|
|
|
+
|
|
|
sample_rois = torch.stack(sample_rois, dim=0)
|
|
|
sample_indexes = torch.stack(sample_indexes, dim=0)
|
|
|
roi_cls_locs, roi_scores = self.model_train([base_feature, sample_rois, sample_indexes, img_size], mode = 'head')
|
|
@@ -293,12 +293,12 @@ class FasterRCNNTrainer(nn.Module):
|
|
|
# 根据建议框的种类,取出对应的回归预测结果
|
|
|
# ------------------------------------------------------ #
|
|
|
n_sample = roi_cls_locs.size()[1]
|
|
|
-
|
|
|
+
|
|
|
roi_cls_loc = roi_cls_locs[i]
|
|
|
roi_score = roi_scores[i]
|
|
|
gt_roi_loc = gt_roi_locs[i]
|
|
|
gt_roi_label = gt_roi_labels[i]
|
|
|
-
|
|
|
+
|
|
|
roi_cls_loc = roi_cls_loc.view(n_sample, -1, 4)
|
|
|
roi_loc = roi_cls_loc[torch.arange(0, n_sample), gt_roi_label]
|
|
|
|
|
@@ -310,21 +310,24 @@ class FasterRCNNTrainer(nn.Module):
|
|
|
|
|
|
roi_loc_loss_all += roi_loc_loss
|
|
|
roi_cls_loss_all += roi_cls_loss
|
|
|
-
|
|
|
+
|
|
|
losses = [rpn_loc_loss_all/n, rpn_cls_loss_all/n, roi_loc_loss_all/n, roi_cls_loss_all/n]
|
|
|
losses = losses + [sum(losses)]
|
|
|
return losses
|
|
|
|
|
|
- def train_step(self, imgs, bboxes, labels, scale, fp16=False, scaler=None):
|
|
|
+ def train_step(self, encoder, imgs, bboxes, labels, scale, fp16=False, scaler=None):
|
|
|
self.optimizer.zero_grad()
|
|
|
+ embed_loss = encoder.get_embeder_loss()
|
|
|
if not fp16:
|
|
|
losses = self.forward(imgs, bboxes, labels, scale)
|
|
|
+ losses[-1] += embed_loss
|
|
|
losses[-1].backward()
|
|
|
self.optimizer.step()
|
|
|
else:
|
|
|
from torch.cuda.amp import autocast
|
|
|
with autocast():
|
|
|
losses = self.forward(imgs, bboxes, labels, scale)
|
|
|
+ losses[-1] += embed_loss
|
|
|
|
|
|
#----------------------#
|
|
|
# 反向传播
|
|
@@ -332,8 +335,8 @@ class FasterRCNNTrainer(nn.Module):
|
|
|
scaler.scale(losses[-1]).backward()
|
|
|
scaler.step(self.optimizer)
|
|
|
scaler.update()
|
|
|
-
|
|
|
- return losses
|
|
|
+
|
|
|
+ return losses, embed_loss
|
|
|
|
|
|
def weights_init(net, init_type='normal', init_gain=0.02):
|
|
|
def init_func(m):
|