由于Faster-rcnn里的计算mAP程序里面有很多嵌套,移植到自己的卷积网络框架下很麻烦,所以把这些嵌套都整合起来方便使用,整合之后的程序只包括test_net.py和voc_eval.py
下面是test_net.py
import _init_paths
from config import cfg
import caffe
import time, os, sys
from caffeWrapper.timer import Timer
import cv2
import numpy as np
from datasets.bbox_transform import clip_boxes, bbox_transform_inv ##这两个函数需要自己import进来
from nms.nms_wrapper import nms
import cPickle
import uuid
#import get_voc_results_file_template, im_detect
from voc_eval import voc_eval
import datetime
def get_voc_results_file_template(cls):##这个函数也改了一下
#comp_id = ('comp4' + '_' + str(uuid.uuid4()))
date = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')##这里把原来的编码名称改为日期(年-月-日-时-分-秒),方便查看
filename = date + '_det_' + 'test' + cls + '.txt'
path = os.path.join(save_prob_path, filename)
return path
def im_detect(net, im):
"""Detect object classes in an image given object proposals.
Arguments:
net (caffe.Net): Fast R-CNN network to use
im (ndarray): color image to test (in BGR order)
Returns:
scores (ndarray): R x K array of object class scores (K includes
background as object category 0)
boxes (ndarray): R x (4*K) array of predicted bounding boxes
"""
blobs = {
'data' : None, 'rois' : None}
im_orig = im.astype(np.float32, copy=True)
im_orig -= cfg.PIXEL_MEANS
im_shape = im_orig.shape
im_size_min = np.min(im_shape[0:2])
im_size_max = np.max(im_shape[0:2])
processed_ims = []
im_scale_factors = []
##这里图片都是一样大小
# for target_size in cfg.TEST.SCALES:
# im_scale = float(target_size) / float(im_size_min)
# # Prevent the biggest axis from being more than MAX_SIZE
# if np.round(im_scale * im_size_max) > cfg.TEST.MAX_SIZE:
# im_scale = float(cfg.TEST.MAX_SIZE) / float(im_size_max)
# im = cv2.resize(im_orig, None, None, fx=im_scale, fy=im_scale,
# interpolation=cv2.INTER_LINEAR)
# im_scale_factors.append(im_scale)
# processed_ims.append(im)
im_scale = 1.0
im = cv2.resize(im_orig, None, None, fx=im_scale, fy=im_scale,
interpolation=cv2.INTER_LINEAR)
im_scale_factors.append(im_scale)
processed_ims.append(im)
max_shape = np.array([imn.shape for imn in processed_ims]).max(axis=0)
num_images = len(processed_ims)
blob = np.zeros((num_images, max_shape[0], max_shape[1], 3),
dtype=np.float32)
for i in xrange(num_images):
imn = processed_ims[i]
blob[i, 0:imn.shape[0], 0:imn.shape[1], :] = imn
# Move channels (axis 3) to axis 1
# Axis order will become: (batch elem, channel, height, width)
channel_swap = (0, 3, 1, 2)
blob = blob.transpose(channel_swap)
blobs['data'] = blob
im_scales = np.array(im_scale_factors)
im_blob = blobs['data']
blobs['im_info'] = np.array([[im_blob.shape[2], im_blob.shape[3], im_scales[0]]],dtype=np.float32)
# reshape network inputs
net.blobs['data'].reshape(*(blobs['data'].shape))
net.blobs['im_info'].reshape(*(blobs['im_info'].shap