Created
August 4, 2017 13:04
-
-
Save helxsz/038f636496299be6f9db9437548fb458 to your computer and use it in GitHub Desktop.
fasterrcnn demo.py on the parking data
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python | |
| # -------------------------------------------------------- | |
| # Faster R-CNN | |
| # Copyright (c) 2015 Microsoft | |
| # Licensed under The MIT License [see LICENSE for details] | |
| # Written by Ross Girshick | |
| # -------------------------------------------------------- | |
| """ | |
| Demo script showing detections in sample images. | |
| See README.md for installation instructions before running. | |
| """ | |
| import sys | |
| sys.path.append('/usr/local/lib/python2.7/site-packages') | |
| import _init_paths | |
| from fast_rcnn.config import cfg | |
| from fast_rcnn.test import im_detect | |
| from fast_rcnn.nms_wrapper import nms | |
| from utils.timer import Timer | |
| import matplotlib.pyplot as plt | |
| import numpy as np | |
| import scipy.io as sio | |
| import caffe, os, sys, cv2 | |
| import argparse | |
| import dlib | |
| CLASSES = ('__background__', | |
| 'car') | |
| NETS = {'vgg16': ('VGG16', | |
| 'VGG16_faster_rcnn_final.caffemodel'), | |
| 'zf': ('ZF', | |
| 'ZF_faster_rcnn_final.caffemodel')} | |
| def vis_detections(image_name, im, class_name, dets, thresh=0.5 ): | |
| """Draw detected bounding boxes.""" | |
| inds = np.where(dets[:, -1] >= thresh)[0] | |
| if len(inds) == 0: | |
| print "not found" | |
| return | |
| im = im[:, :, (2, 1, 0)] | |
| fig, ax = plt.subplots(figsize=(6, 6)) | |
| ax.imshow(im, aspect='equal') | |
| for i in inds: | |
| bbox = dets[i, :4] | |
| score = dets[i, -1] | |
| ax.add_patch( | |
| plt.Rectangle((bbox[0], bbox[1]), | |
| bbox[2] - bbox[0], | |
| bbox[3] - bbox[1], fill=False, | |
| edgecolor='red', linewidth=3.5) | |
| ) | |
| ax.text(bbox[0], bbox[1] - 2, | |
| '{:s} {:.3f}'.format(class_name, score), | |
| bbox=dict(facecolor='blue', alpha=0.5), | |
| fontsize=14, color='white') | |
| ax.set_title(('{} detections with ' | |
| 'p({} | box) >= {:.1f}').format(class_name, class_name, | |
| thresh), | |
| fontsize=14) | |
| plt.axis('off') | |
| plt.tight_layout() | |
| plt.draw() | |
| plt.savefig('./test/rnndemo/'+str(image_name)+'.png', bbox_inches='tight') | |
| plt.close(fig) | |
| def demo(net, image_name): | |
| """Detect object classes in an image using pre-computed object proposals.""" | |
| # Load the demo image | |
| im_file = os.path.join("data", 'demo_car', image_name) | |
| im = cv2.imread(im_file) | |
| #im = cv2.resize(im, (0,0), fx=0.25, fy=0.25) | |
| height, width = im.shape[:2] | |
| print height, width | |
| # Detect all object classes and regress object bounds | |
| timer = Timer() | |
| timer.tic() | |
| scores, boxes = im_detect(net, im) | |
| timer.toc() | |
| print ('Detection took {:.3f}s for ' | |
| '{:d} object proposals').format(timer.total_time, boxes.shape[0]) | |
| # Visualize detections for each class | |
| CONF_THRESH = 0.1 | |
| NMS_THRESH = 0.3 | |
| for cls_ind, cls in enumerate(CLASSES[1:]): | |
| cls_ind += 1 # because we skipped background | |
| cls_boxes = boxes[:, 4*cls_ind:4*(cls_ind + 1)] | |
| cls_scores = scores[:, cls_ind] | |
| dets = np.hstack((cls_boxes, | |
| cls_scores[:, np.newaxis])).astype(np.float32) | |
| #keep = nms(dets, NMS_THRESH) | |
| #dets = dets[keep, :] | |
| vis_detections(image_name, im, cls, dets, thresh=CONF_THRESH) | |
| def parse_args(): | |
| """Parse input arguments.""" | |
| parser = argparse.ArgumentParser(description='Faster R-CNN demo') | |
| parser.add_argument('--gpu', dest='gpu_id', help='GPU device id to use [0]', | |
| default=0, type=int) | |
| parser.add_argument('--cpu', dest='cpu_mode', | |
| help='Use CPU mode (overrides --gpu)', | |
| action='store_true') | |
| #parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16]',choices=NETS.keys(), default='vgg16') | |
| parser.add_argument('--prototxt', dest='prototxt', | |
| default='parking/VGG16_CAR/faster_rcnn_alt_opt/faster_rcnn_test.pt') | |
| parser.add_argument('--caffemodel', dest='caffemodel', | |
| default='faster_rcnn_alt_opt/mycar_test/VGG16_CAR_faster_rcnn_final2/VGG16_CAR_faster_rcnn_final.caffemodel') | |
| args = parser.parse_args() | |
| return args | |
| if __name__ == '__main__': | |
| cfg.TEST.HAS_RPN = True # Use RPN for proposals | |
| args = parse_args() | |
| prototxt = os.path.join("/home/sizhexi/caffe/py-faster-rcnn/models", args.prototxt) | |
| caffemodel = os.path.join("/home/sizhexi/caffe/py-faster-rcnn/output", args.caffemodel) | |
| #prototxt = "/home/gnss/caffe/py-faster-rcnn/models/parking/VGG16_CAR_skiprcnn2/faster_rcnn_alt_opt/faster_rcnn_test.pt" | |
| #caffemodel = "/home/gnss/caffe/py-faster-rcnn/output/faster_rcnn_alt_opt/mycar_test/VGG16/VGG16_CAR_faster_rcnn_final.caffemodel" | |
| #prototxt = "/home/gnss/caffe/py-faster-rcnn/models/parking/VGG16_CAR_skiprcnn/faster_rcnn_alt_opt/faster_rcnn_test.pt" | |
| #caffemodel = "/home/gnss/caffe/py-faster-rcnn/output/faster_rcnn_alt_opt/mycar_test/VGG16-skiprcnn/VGG16_CAR_skiprcnn_faster_rcnn_final.caffemodel" | |
| if not os.path.isfile(caffemodel): | |
| raise IOError(('{:s} not found.\nDid you run ./data/script/' | |
| 'fetch_faster_rcnn_models.sh?').format(caffemodel)) | |
| if args.cpu_mode: | |
| caffe.set_mode_cpu() | |
| else: | |
| caffe.set_mode_gpu() | |
| caffe.set_device(args.gpu_id) | |
| cfg.GPU_ID = args.gpu_id | |
| net = caffe.Net(prototxt, caffemodel, caffe.TEST) | |
| print '\n\nLoaded network {:s}'.format(caffemodel) | |
| # Warmup on a dummy image | |
| im = 128 * np.ones((300, 500, 3), dtype=np.uint8) | |
| for i in xrange(2): | |
| _, _= im_detect(net, im) | |
| im_names = ['32.png', '33.png', '34.png', '37.png', '38.png' ] | |
| #im_names = ['66.png','67.png', '68.png', '69.png', '70.png' ] | |
| #im_names = ['101.png','102.png', '103.png', '104.png', '105.png' ] | |
| for im_name in im_names: | |
| print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' | |
| print 'Demo for data/demo/{}'.format(im_name) | |
| demo(net, im_name) | |
| plt.show() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env python | |
| # -------------------------------------------------------- | |
| # Fast/er/ R-CNN | |
| # Copyright (c) 2015 Microsoft | |
| # Licensed under The MIT License [see LICENSE for details] | |
| # Written by Ross Girshick | |
| # -------------------------------------------------------- | |
| """Generate RPN proposals.""" | |
| import _init_paths | |
| import numpy as np | |
| from fast_rcnn.config import cfg, cfg_from_file, cfg_from_list, get_output_dir | |
| from datasets.factory import get_imdb | |
| #from rpn.generate import im_proposals | |
| from utils.blob import im_list_to_blob | |
| from utils.timer import Timer | |
| import numpy as np | |
| import cv2 | |
| import matplotlib.pyplot as plt | |
| import cPickle | |
| import caffe | |
| import argparse | |
| import pprint | |
| import time, os, sys | |
| def parse_args(): | |
| """ | |
| Parse input arguments | |
| """ | |
| parser = argparse.ArgumentParser(description='Test a Fast R-CNN network') | |
| parser.add_argument('--gpu', dest='gpu_id', help='GPU id to use', | |
| default=0, type=int) | |
| parser.add_argument('--def', dest='prototxt', | |
| help='prototxt file defining the network', | |
| default=None, type=str) | |
| parser.add_argument('--net', dest='caffemodel', | |
| help='model to test', | |
| default=None, type=str) | |
| parser.add_argument('--cfg', dest='cfg_file', | |
| help='optional config file', default=None, type=str) | |
| parser.add_argument('--wait', dest='wait', | |
| help='wait until net file exists', | |
| default=True, type=bool) | |
| parser.add_argument('--imdb', dest='imdb_name', | |
| help='dataset to test', | |
| default='voc_2007_test', type=str) | |
| parser.add_argument('--set', dest='set_cfgs', | |
| help='set config keys', default=None, | |
| nargs=argparse.REMAINDER) | |
| if len(sys.argv) == 1: | |
| parser.print_help() | |
| sys.exit(1) | |
| args = parser.parse_args() | |
| return args | |
| def _vis_proposals(id, im, dets, thresh=0.5): | |
| """Draw detected bounding boxes.""" | |
| inds = np.where(dets[:, -1] >= thresh)[0] | |
| if len(inds) == 0: | |
| return | |
| class_name = 'obj' | |
| im = im[:, :, (2, 1, 0)] | |
| fig, ax = plt.subplots(figsize=(12, 12)) | |
| ax.imshow(im, aspect='equal') | |
| for i in inds: | |
| bbox = dets[i, :4] | |
| score = dets[i, -1] | |
| ax.add_patch( | |
| plt.Rectangle((bbox[0], bbox[1]), | |
| bbox[2] - bbox[0], | |
| bbox[3] - bbox[1], fill=False, | |
| edgecolor='red', linewidth=3.5) | |
| ) | |
| ax.text(bbox[0], bbox[1] - 2, | |
| '{:s} {:.3f}'.format(class_name, score), | |
| bbox=dict(facecolor='blue', alpha=0.5), | |
| fontsize=14, color='white') | |
| ax.set_title(('{} detections with ' | |
| 'p({} | box) >= {:.1f}').format(class_name, class_name, | |
| thresh), | |
| fontsize=14) | |
| plt.axis('off') | |
| plt.tight_layout() | |
| #plt.draw() | |
| plt.savefig('./test/rpndemo/'+str(id)+'.png', bbox_inches='tight') | |
| plt.close(fig) | |
| def _get_image_blob(im): | |
| """Converts an image into a network input. | |
| Arguments: | |
| im (ndarray): a color image in BGR order | |
| Returns: | |
| blob (ndarray): a data blob holding an image pyramid | |
| im_scale_factors (list): list of image scales (relative to im) used | |
| in the image pyramid | |
| """ | |
| 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 = [] | |
| assert len(cfg.TEST.SCALES) == 1 | |
| target_size = cfg.TEST.SCALES[0] | |
| 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_info = np.hstack((im.shape[:2], im_scale))[np.newaxis, :] | |
| processed_ims.append(im) | |
| # Create a blob to hold the input images | |
| blob = im_list_to_blob(processed_ims) | |
| return blob, im_info | |
| def im_proposals(net, im): | |
| """Generate RPN proposals on a single image.""" | |
| blobs = {} | |
| blobs['data'], blobs['im_info'] = _get_image_blob(im) | |
| net.blobs['data'].reshape(*(blobs['data'].shape)) | |
| net.blobs['im_info'].reshape(*(blobs['im_info'].shape)) | |
| blobs_out = net.forward( | |
| data=blobs['data'].astype(np.float32, copy=False), | |
| im_info=blobs['im_info'].astype(np.float32, copy=False)) | |
| scale = blobs['im_info'][0, 2] | |
| boxes = blobs_out['rois'][:, 1:].copy() / scale | |
| scores = blobs_out['scores'].copy() | |
| return boxes, scores | |
| def imdb_proposals(net, imdb): | |
| """Generate RPN proposals on all images in an imdb.""" | |
| _t = Timer() | |
| imdb_boxes = [[] for _ in xrange(len(imdb))] | |
| for i in xrange(len(imdb)): | |
| im_file = os.path.join("data", 'demo_car', imdb[i]) | |
| im = cv2.imread(im_file) | |
| _t.tic() | |
| imdb_boxes[i], scores = im_proposals(net, im) | |
| _t.toc() | |
| print 'im_proposals: {:d}/{:.3f}s' \ | |
| .format(i + 1, _t.average_time) | |
| if 1: | |
| dets = np.hstack((imdb_boxes[i], scores)) | |
| # from IPython import embed; embed() | |
| _vis_proposals(i, im, dets[:200, :], thresh=0.9) | |
| plt.show() | |
| return imdb_boxes | |
| if __name__ == '__main__': | |
| args = parse_args() | |
| print('Called with args:') | |
| print(args) | |
| 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) | |
| cfg.GPU_ID = args.gpu_id | |
| # RPN test settings | |
| cfg.TEST.RPN_PRE_NMS_TOP_N = -1 | |
| cfg.TEST.RPN_POST_NMS_TOP_N = 2000 | |
| print('Using config:') | |
| pprint.pprint(cfg) | |
| while not os.path.exists(args.caffemodel) and args.wait: | |
| print('Waiting for {} to exist...'.format(args.caffemodel)) | |
| time.sleep(10) | |
| caffe.set_mode_gpu() | |
| caffe.set_device(args.gpu_id) | |
| net = caffe.Net(args.prototxt, args.caffemodel, caffe.TEST) | |
| net.name = os.path.splitext(os.path.basename(args.caffemodel))[0] | |
| im_names = ['32.png', '33.png', '34.png', '37.png', '38.png' ] | |
| #im_names = ['66.png','67.png', '68.png', '69.png', '70.png' ] | |
| #im_names = ['101.png','102.png', '103.png', '104.png', '105.png' ] | |
| imdb_boxes = imdb_proposals(net, im_names) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment