def add_bbox_regression_targets(roidb):
"""Add information needed to train bounding-box regressors."""
assert len(roidb) > 0
assert 'info_boxes' in roidb[0], 'Did you call prepare_roidb first?'
num_images = len(roidb)
# Infer number of classes from the number of columns in gt_overlaps
num_classes = roidb[0]['gt_overlaps'].shape[1]
# Compute values needed for means and stds
# var(x) = E(x^2) - E(x)^2
class_counts = np.zeros((num_classes, 1)) + cfg.EPS
sums = np.zeros((num_classes, 4))
squared_sums = np.zeros((num_classes, 4))
for im_i in xrange(num_images):
targets = roidb[im_i]['info_boxes']
for cls in xrange(1, num_classes):
cls_inds = np.where(targets[:, 12] == cls)[0]
if cls_inds.size > 0:
class_counts[cls] += cls_inds.size
sums[cls, :] += targets[cls_inds, 14:].sum(axis=0)
squared_sums[cls, :] += (targets[cls_inds, 14:] ** 2).sum(axis=0)
means = sums / class_counts
stds = np.sqrt(squared_sums / class_counts - means ** 2)
# Normalize targets
for im_i in xrange(num_images):
targets = roidb[im_i]['info_boxes']
for cls in xrange(1, num_classes):
cls_inds = np.where(targets[:, 12] == cls)[0]
roidb[im_i]['info_boxes'][cls_inds, 14:] -= means[cls, :]
if stds[cls, 0] != 0:
roidb[im_i]['info_boxes'][cls_inds, 14:] /= stds[cls, :]
# These values will be needed for making predictions
# (the predicts will need to be unnormalized and uncentered)
return means.ravel(), stds.ravel()
roidb.py 文件源码
python
阅读 28
收藏 0
点赞 0
评论 0
评论列表
文章目录