训练完faster rcnn想要计算一下mAP,结果整了半天才成功,在这里记录一下,省的下次忘了。
前面直接说计算方法和可能遇到的错误,后面再详细对代码进行解析。
计算流程
首先说一下faster rcnn中mAP的计算流程。主要流程为:
1、运行/tools下的test_net.py文件。
2、test_net.py文件调用/lib/fast_rcnn/test.py文件中的test_net函数进行检测。
3、test_net函数在检测完成后调用/lib/datasets/pascal_voc.py中的evaluate_detections函数计算mAP。
测试命令如下
./tools/test_net.py --gpu 0 \
--def PATH/TO/test.prototxt \
--net PATH/TO/vgg16_faster_rcnn_iter_40000.caffemodel \ #训练好的模型
--imdb voc_2007_test #数据集名称
错误一
'Selective search data not found at: {}'.format(filename)
AssertionError: Selective search data not found at: /home/xuwh/Detect-model/py-faster-rcnn/data/xiaoding-data/selective_search_data/voc_2007_test.mat
这时需要打开config文件,把__C.TEST.HAS_RPN = False改为True。
错误二
File "/home/xuwh/Detect-model/py-faster-rcnn/tools/../lib/datasets/pascal_voc.py", line 250, in _write_voc_results_file
with open(filename, 'wt') as f:
IOError: [Errno 2] No such file or directory: '/home/xuwh/Detect-model/py-faster-rcnn/data/xiaoding-data/results/VOC2007/Main/comp4_d721c71f-dcb0-46ad-a93d-d7e6738d6cbf_det_test_type_none.txt'
根提示,打开pascal_voc.py 修改下面的函数中的filename,修改结果如下,修改原因会在后面解释
def _get_voc_results_file_template(self):
# VOCdevkit/results/VOC2007/Main/<comp_id>_det_test_aeroplane.txt
# filename = self._get_comp_id() + '_det_' + self._image_set + '_{:s}.txt'
filename = self._image_set + '_{:s}'
path = os.path.join(
self._devkit_path,
'results',
'VOC' + self._year,
'Main',
filename)
return path
然后根据没有文件夹提示的路径手动新建文件夹。
最后在运行就可以了,我的结果如下
代码解析
首先运行的是/tools下的test_net.py文件,部分代码如下,这部分都是一些初始化的过程。
if __name__ == '__main__':
args = parse_args() #获取命令行参数,参数具体含义见该文件的parse_args函数
print('Called with args:')
print(args)
if args.cfg_file is not None:
cfg_from_file(args.cfg_file)
if ar