py-faster-rcnn---test_net.py

./experiment/script/faster_rcnn_alt_opt.sh 和 ./experiment/script/faster_rcnn_end2end.sh 都调用了./tools/test_net.py

imdb = get_imdb(args.imdb_name)初始化imdb类,调用factory.py和pascal.py
test_net(net, imdb, max_per_image=args.max_per_image, vis=args.vis)调用./lib/fast_rcnn/test.py

test_net函数==>./lib/fast_rcnn/test.py

1、output_dir = get_output_dir(imdb, net)输出路径
2、scores, boxes = im_detect(net, im, box_proposals)通过网络forward得到scores和boxes
3、遍历除背景外的所有类别,取出每个类别score>thresh(=0.05)的所有框,NMS(阈值为0.3)
4、max_per_image默认为100,每张图像框大于100则取score最大的100个
5、cPickle.dump(all_boxes, f, cPickle.HIGHEST_PROTOCOL)将all_bixes写入文件,f = os.path.join(output_dir, 'detections.pkl')。all_boxes[j][i]:==>j代表类别(不包含背景),i代表不同图像,all_boxes[j][i]存储二维数组,行数是第i个图像第j个类别的所有框数目,有5列,前四列是框的坐标,最后一列是分数
6、imdb.evaluate_detections(all_boxes, output_dir): ./lib/datasets/pascal_voc.py

    def evaluate_detections(self, all_boxes, output_dir):
        self._write_voc_results_file(all_boxes)
        self._do_python_eval(output_dir)
        if self.config['matlab_eval']:
            self._do_matlab_eval(output_dir)
        if self.config['cleanup']:
            for cls in self._classes:
                if cls == '__background__':
                    continue
                filename = self._get_voc_results_file_template().format(cls)
                os.remove(filename)

evaluate_detections函数

_write_voc_results_file: 根据不同类别写result file,文件中遍历不同图像,所有的boxes,一次写入一个框的img_id score x0+1 y0+1 x1+1 y1+1 六个数
_do_python_eval:根据上面的result file,对不同类别的结果进行评估,写入output文件

_do_python_eval函数:

rec, prec, ap = voc_eval(filename, annopath, imagesetfile, cls, cachedir, ovthresh=0.5, use_07_metric=use_07_metric)是主要函数。(./lib/datasets/voc_eval.py)
filename表示_write_voc_results_file得到的不同类别对应的文件
annopath表示ground-truth的xml文件
imagesetfile表示测试的图像列表
cls是类别
cachedir根据imagesetfile图片名解析annopath-xml文件得到的文件,文件格式是每个图像名对应图像中的boxes和类别等,如不存在会在voc_eval函数生成。
ovthresh overlap的阈值
返回值 recall、precision、AP(Average Precision)平均正确率

    def _do_python_eval(self, output_dir = 'output'):
        annopath = os.path.join(
            self._devkit_path,
            'VOC' + self._year,
            'Annotations',
            '{:s}.xml')
        imagesetfile = os.path.join(
            self._devkit_path,
            'VOC' + self._year,
            'ImageSets',
            'Main',
            self._image_set + '.txt')
        cachedir = os.path.join(self._devkit_path, 'annotations_cache')
        aps = []
        # The PASCAL VOC metric changed in 2010
        use_07_metric = True if int(self._year) < 2010 else False
        print 'VOC07 metric? ' + ('Yes' if use_07_metric else 'No')
        if not os.path.isdir(output_dir):
            os.mkdir(output_dir)
        for i, cls in enumerate(self._classes):
            if cls == '__background__':
                continue
            filename = self._get_voc_results_file_template().format(cls)
            rec, prec, ap = voc_eval(
                filename, annopath, imagesetfile, cls, cachedir, ovthresh=0.5,
                use_07_metric=use_07_metric)
            aps += [ap]
            print('AP for {} = {:.4f}'.format(cls, ap))
            with open(os.path.join(output_dir, cls + '_pr.pkl'), 'w') as f:
                cPickle.dump({'rec': rec, 'prec': prec, 'ap': ap}, f)
        print('Mean AP = {:.4f}'.format(np.mean(aps)))
        print('~~~~~~~~')
        print('Results:')
        for ap in aps:
            print('{:.3f}'.format(ap))
        print('{:.3f}'.format(np.mean(aps)))
  ...

voc_eval函数:

1、加载或生成cachedir
2、得到当前传入的类别cls,根据cachedir生成每个图像对应的class_recs[imagename] = {'bbox': bbox,'difficult': difficult, 'det': det}difficult通常均为0,det均为False
3、从filename/detpath中读取网络生成的cls类别box结果,所有的box坐标和图像id都按score高低排序,注意:这里图像id的数目不等于总的test文件数,可能有多个相同的文件名,以为取图像id的某一行只对应一个box
4、按顺序取box和img_id,与img_id对应的所有ground-truth的box计算overlaps,如果大于阈值ovthresh = 0.5 且R['det'][jmax]=false则为tp,否则为fp。R['det'][jmax]应该是当一个框和一个ground-truth计算是tp,其他的框就不能和这个ground-truth是tp
5、计算recall、precision
6、计算ap = voc_ap(rec, prec, use_07_metric),当 use_07_metric使用11点差值法计算ap,否则Average precision as defined by TREC. 计算方法是找到recall变化时(TP被recall时)的点,求这些点对应的precision的均值。

问题:

BB = BB[sorted_ind, :]
IndexError: too many indices for array

运行时出现错误,应该是网络问题,没有学到boxes

def voc_ap(rec, prec, use_07_metric=False):
    """ ap = voc_ap(rec, prec, [use_07_metric])
    Compute VOC AP given precision and recall.
    If use_07_metric is true, uses the
    VOC 07 11 point method (default:False).
    """
    if use_07_metric:
        # 11 point metric
        ap = 0.
        for t in np.arange(0., 1.1, 0.1):
            if np.sum(rec >= t) == 0:
                p = 0
            else:
                p = np.max(prec[rec >= t])
            ap = ap + p / 11.
    else:
        # correct AP calculation
        # first append sentinel values at the end
        mrec = np.concatenate(([0.], rec, [1.]))
        mpre = np.concatenate(([0.], prec, [0.]))

        # compute the precision envelope
        for i in range(mpre.size - 1, 0, -1):
            mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i])

        # to calculate area under PR curve, look for points
        # where X axis (recall) changes value
        i = np.where(mrec[1:] != mrec[:-1])[0]

        # and sum (\Delta recall) * prec
        ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1])
    return ap
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容