Faster RCNN imdb.py

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章