def test_net(sess, net, imdb, weights_filename, max_per_image=100, thresh=0.05): np.random.seed(cfg.RNG_SEED) """Test a Fast R-CNN network on an image database.""" num_images = len(imdb.image_index) # all detections are collected into: # all_boxes[cls][image] = N x 5 array of detections in # (x1, y1, x2, y2, score) all_boxes = [[[] for _ in range(num_images)] for _ in range(imdb.num_classes)] output_dir = get_output_dir(imdb, weights_filename) # timers _t = {'im_detect': Timer(), 'misc': Timer()} for i in range(num_images): im = cv2.imread(imdb.image_path_at(i)) _t['im_detect'].tic() scores, boxes = im_detect(sess, net, im) _t['im_detect'].toc() _t['misc'].tic() # skip j = 0, because it's the background class for j in range(1, imdb.num_classes): inds = np.where(scores[:, j] > thresh)[0] cls_scores = scores[inds, j] cls_boxes = boxes[inds, j * 4:(j + 1) * 4] cls_dets = np.hstack((cls_boxes, cls_scores[:, np.newaxis])) \ .astype(np.float32, copy=False) keep = nms(cls_dets, cfg.TEST.NMS) cls_dets = cls_dets[keep, :] all_boxes[j][i] = cls_dets # Limit to max_per_image detections *over all classes* if max_per_image > 0: image_scores = np.hstack( [all_boxes[j][i][:, -1] for j in range(1, imdb.num_classes)]) if len(image_scores) > max_per_image: image_thresh = np.sort(image_scores)[-max_per_image] for j in range(1, imdb.num_classes): keep = np.where(all_boxes[j][i][:, -1] >= image_thresh)[0] all_boxes[j][i] = all_boxes[j][i][keep, :] _t['misc'].toc() print('im_detect: {:d}/{:d} {:.3f}s {:.3f}s' \ .format(i + 1, num_images, _t['im_detect'].average_time, _t['misc'].average_time)) det_file = os.path.join(output_dir, 'detections.pkl') with open(det_file, 'wb') as f: pickle.dump(all_boxes, f, pickle.HIGHEST_PROTOCOL) print('Evaluating detections') imdb.evaluate_detections(all_boxes, output_dir)
def extract_net(sess, net, imdb, weights_filename, roidb, max_per_image=100, thresh=0.05): #change from test_net, and this function is used to extract features from conv5 of vgg16 np.random.seed(cfg.RNG_SEED) """Test a Fast R-CNN network on an image database.""" num_images = len(imdb.image_index) # all detections are collected into: # all_boxes[cls][image] = N x 5 array of detections in # (x1, y1, x2, y2, score) all_boxes = [[[] for _ in range(num_images)] for _ in range(imdb.num_classes)] output_dir = get_output_dir(imdb, weights_filename) print("output_dir is:", output_dir) print("\n") # timers _t = {'im_detect': Timer(), 'misc': Timer()} data_input = [] #N_save is the number of processed images which will be saved into one file N_save = 100 for i in range(1000): im = cv2.imread(imdb.image_path_at(i)) _t['im_detect'].tic() feature_maps = im_extract(sess, net, im) fea = np.squeeze(feature_maps) data_temp = {} data_temp['img_path'] = imdb.image_path_at(i) data_temp['box'] = roidb[i]['boxes'] data_temp['img_shape'] = np.shape(im) data_temp['fea'] = fea data_input.append(data_temp) if (i + 1) % N_save == 0: file_name_of_input = '/home/yangxu/project/rd/input/input' + format( int((i + 1) / N_save), '03') + '.npz' np.savez(file_name_of_input, data_input=data_input) data_input = [] _t['im_detect'].toc() _t['misc'].tic() print('im_extract: {:d}/{:d} {:.3f}s {:.3f}s' \ .format(i + 1, num_images, _t['im_detect'].average_time, _t['misc'].average_time)) print( "i is: {0}, the path of image is {1}, shape of the image is {2}, the shape of the feature map is{3}\n" .format(i, imdb.image_path_at(i), np.shape(im), np.shape(fea)))
if args.cfg_file is not None: cfg_from_file(args.cfg_file) if args.set_cfgs is not None: cfg_from_list(args.set_cfgs) print('Using config:') pprint.pprint(cfg) np.random.seed(cfg.RNG_SEED) # train set imdb, roidb = combined_roidb(args.imdb_name) print('{:d} roidb entries'.format(len(roidb))) # output directory where the models are saved output_dir = get_output_dir(imdb, args.tag) print('Output will be saved to `{:s}`'.format(output_dir)) # tensorboard directory where the summaries are saved during training tb_dir = get_output_tb_dir(imdb, args.tag) print('TensorFlow summaries will be saved to `{:s}`'.format(tb_dir)) # also add the validation set, but with no flipping images orgflip = cfg.TRAIN.USE_FLIPPED cfg.TRAIN.USE_FLIPPED = False _, valroidb = combined_roidb(args.imdbval_name) print('{:d} validation roidb entries'.format(len(valroidb))) cfg.TRAIN.USE_FLIPPED = orgflip # load network if args.net == 'vgg16':
pre_train_weight = project_path + "/data/pre_train_weight/" + arg_net + ".ckpt" cfg_from_file(project_path + "/experiments/cfgs/" + arg_net + ".yml") #载入参数配置 cfg_from_list(set_cfgs) #修改参数配置 print('Using config:') pprint.pprint(cfg) # roidb:所有训练图片的gt_boxes # imdb:训练数据集的相关信息:包括类别列表,所有的图片名称的索引,数据集名称等等 imdb, roidb = combined_roidb("gridsum_car_train") print(roidb[0]['boxes']) print(roidb[0]) print('{:d} roidb entries'.format(len(roidb))) # output directory where the models are saved output_dir = get_output_dir(imdb, "") print('Output will be saved to `{:s}`'.format(output_dir)) # tensorboard directory where the summaries are saved during training tb_dir = get_output_tb_dir(imdb, "") # 同样的方法载入val数据集 print('TensorFlow summaries will be saved to `{:s}`'.format(tb_dir)) _, valroidb = combined_roidb("gridsum_car_train") print('{:d} validation roidb entries'.format(len(valroidb))) if arg_net == 'vgg16': net = vgg16() elif arg_net == 'res50': net = resnetv1(num_layers=50) elif arg_net == 'res101': net = resnetv1(num_layers=101) elif arg_net == 'res152':
# train set imdb, roidb = get_roidb('voc_2007_trainval') #训练集 #print('{:d} roidb entries'.format(len(roidb))) pretrained_model = 'E:/fasterwrite/data/imagenet_weights/vgg16.ckpt' ''' print(len(roidb)) print (type(roidb[0]['image'])) im=cv2.imread(roidb[0]['image']) print(im) im=cv2.imread(roidb[6000]['image']) print(im) ''' weights_filename = 'default' output_dir = get_output_dir(imdb, weights_filename) print('Output will be saved to `{:s}`'.format(output_dir)) # tb_dir = get_output_tb_dir(imdb,weights_filename) net = vgg16() orgflip = cfg.TRAIN.USE_FLIPPED cfg.TRAIN.USE_FLIPPED = False valimdb, valroidb = get_roidb('voc_2007_test') #获取测试集数据 #测试验证集数据 #im=cv2.imread(valroidb[6000]['image'] #print(im) print('{:d} validatio n roidb entries'.format(len(valroidb))) cfg.TRAIN.USE_FLIPPED = orgflip #截止目前测试均通过