def create_roidb_from_box_list(self, box_list, gt_roidb): 從box_list 中讀取每張圖像的boxes
def create_roidb_from_box_list(self, box_list, gt_roidb):
# box_list 的大小要與gt_roidb 相同, 並且各圖像一一對應
assert len(box_list) == self.num_images, \
'Number of boxes must match number of ground-truth images'
roidb = []
for i in xrange(self.num_images):
# 遍歷每張圖像, 當前圖像中box的個數
boxes = box_list[i]
# 當前這張圖像中的box個數
num_boxes = boxes.shape[0]
# overlaps的shape始終爲:num_boxes × num_classes 。
overlaps = np.zeros((num_boxes, self.num_classes), dtype=np.float32)
if gt_roidb is not None and gt_roidb[i]['boxes'].size > 0:
gt_boxes = gt_roidb[i]['boxes']
gt_classes = gt_roidb[i]['gt_classes']
# 計算當前圖像的rpn_file中記錄的boxes與gtboxes的IOU overlap, 返回的gt_overlaps的
#shape爲 num_boxes × num_gtboxes, 後面要對gt_overlaps求max和argmax
gt_overlaps = bbox_overlaps(boxes.astype(np.float),
gt_boxes.astype(np.float))
# 對gt_overlaps 求argmax 和 max
argmaxes = gt_overlaps.argmax(axis=1)
maxes = gt_overlaps.max(axis=1)
# 返回 maxes > 0的位置信息
I = np.where(maxes > 0)[0]
overlaps[I, gt_classes[argmaxes[I]]] = maxes[I]
overlaps = scipy.sparse.csr_matrix(overlaps)
roidb.append({
'boxes' : boxes,
# gt_classes 爲一個全0一維數組(這是爲什麼????)
'gt_classes' : np.zeros((num_boxes,), dtype=np.int32),
# 最終還是將shape爲num_boxes × num_classes 的數組進行存儲, 所以,以‘rpn’方法生成的
#rpn_roidb中的gt_overlaps是rpn_file中的box與gt_roidb中box的overlap,而不像
#gt_roidb()方法生成的gt_roidb中的gt_overlaps全部爲1.0
'gt_overlaps' : overlaps,
'flipped' : False,
'seg_areas' : np.zeros((num_boxes,), dtype=np.float32),
})
return roidb
def merge_roidbs(a, b) 類imdb的靜態方法,將a b兩個roidb歸併爲一個roidb
@staticmethod
def merge_roidbs(a, b):
assert len(a) == len(b)
for i in xrange(len(a)):
# boxes 採用vstack
a[i]['boxes'] = np.vstack((a[i]['boxes'], b[i]['boxes']))
# gt_classes 採用hstack
a[i]['gt_classes'] = np.hstack((a[i]['gt_classes'],
b[i]['gt_classes']))
# gt_overlaps 採用vstack
a[i]['gt_overlaps'] = scipy.sparse.vstack([a[i]['gt_overlaps'],
b[i]['gt_overlaps']])
# seg_areas 採用hstack
a[i]['seg_areas'] = np.hstack((a[i]['seg_areas'],
b[i]['seg_areas']))
return a