diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 000000000..ba734d257 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +recursive-include faster_rcnn * \ No newline at end of file diff --git a/demo.py b/demo.py deleted file mode 100644 index af78b0986..000000000 --- a/demo.py +++ /dev/null @@ -1,380 +0,0 @@ -# -------------------------------------------------------- -# Tensorflow Faster R-CNN -# Licensed under The MIT License [see LICENSE for details] -# Written by Jiasen Lu, Jianwei Yang, based on code from Ross Girshick -# -------------------------------------------------------- -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import _init_paths -import os -import sys -import numpy as np -import argparse -import pprint -import pdb -import time -import cv2 -import torch -from torch.autograd import Variable -import torch.nn as nn -import torch.optim as optim - -import torchvision.transforms as transforms -import torchvision.datasets as dset -from scipy.misc import imread -from roi_data_layer.roidb import combined_roidb -from roi_data_layer.roibatchLoader import roibatchLoader -from model.utils.config import cfg, cfg_from_file, cfg_from_list, get_output_dir -from model.rpn.bbox_transform import clip_boxes -# from model.nms.nms_wrapper import nms -from model.roi_layers import nms -from model.rpn.bbox_transform import bbox_transform_inv -from model.utils.net_utils import save_net, load_net, vis_detections -from model.utils.blob import im_list_to_blob -from model.faster_rcnn.vgg16 import vgg16 -from model.faster_rcnn.resnet import resnet -import pdb - -try: - xrange # Python 2 -except NameError: - xrange = range # Python 3 - - -def parse_args(): - """ - Parse input arguments - """ - parser = argparse.ArgumentParser(description='Train a Fast R-CNN network') - parser.add_argument('--dataset', dest='dataset', - help='training dataset', - default='pascal_voc', type=str) - parser.add_argument('--cfg', dest='cfg_file', - help='optional config file', - default='cfgs/vgg16.yml', type=str) - parser.add_argument('--net', dest='net', - help='vgg16, res50, res101, res152', - default='res101', type=str) - parser.add_argument('--set', dest='set_cfgs', - help='set config keys', default=None, - nargs=argparse.REMAINDER) - parser.add_argument('--load_dir', dest='load_dir', - help='directory to load models', - default="/srv/share/jyang375/models") - parser.add_argument('--image_dir', dest='image_dir', - help='directory to load images for demo', - default="images") - parser.add_argument('--cuda', dest='cuda', - help='whether use CUDA', - action='store_true') - parser.add_argument('--mGPUs', dest='mGPUs', - help='whether use multiple GPUs', - action='store_true') - parser.add_argument('--cag', dest='class_agnostic', - help='whether perform class_agnostic bbox regression', - action='store_true') - parser.add_argument('--parallel_type', dest='parallel_type', - help='which part of model to parallel, 0: all, 1: model before roi pooling', - default=0, type=int) - parser.add_argument('--checksession', dest='checksession', - help='checksession to load model', - default=1, type=int) - parser.add_argument('--checkepoch', dest='checkepoch', - help='checkepoch to load network', - default=1, type=int) - parser.add_argument('--checkpoint', dest='checkpoint', - help='checkpoint to load network', - default=10021, type=int) - parser.add_argument('--bs', dest='batch_size', - help='batch_size', - default=1, type=int) - parser.add_argument('--vis', dest='vis', - help='visualization mode', - action='store_true') - parser.add_argument('--webcam_num', dest='webcam_num', - help='webcam ID number', - default=-1, type=int) - - args = parser.parse_args() - return args - -lr = cfg.TRAIN.LEARNING_RATE -momentum = cfg.TRAIN.MOMENTUM -weight_decay = cfg.TRAIN.WEIGHT_DECAY - -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 = [] - 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) - - # Create a blob to hold the input images - blob = im_list_to_blob(processed_ims) - - return blob, np.array(im_scale_factors) - -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.USE_GPU_NMS = args.cuda - - print('Using config:') - pprint.pprint(cfg) - np.random.seed(cfg.RNG_SEED) - - # train set - # -- Note: Use validation set and disable the flipped to enable faster loading. - - input_dir = args.load_dir + "/" + args.net + "/" + args.dataset - if not os.path.exists(input_dir): - raise Exception('There is no input directory for loading network from ' + input_dir) - load_name = os.path.join(input_dir, - 'faster_rcnn_{}_{}_{}.pth'.format(args.checksession, args.checkepoch, args.checkpoint)) - - pascal_classes = np.asarray(['__background__', - 'aeroplane', 'bicycle', 'bird', 'boat', - 'bottle', 'bus', 'car', 'cat', 'chair', - 'cow', 'diningtable', 'dog', 'horse', - 'motorbike', 'person', 'pottedplant', - 'sheep', 'sofa', 'train', 'tvmonitor']) - - # initilize the network here. - if args.net == 'vgg16': - fasterRCNN = vgg16(pascal_classes, pretrained=False, class_agnostic=args.class_agnostic) - elif args.net == 'res101': - fasterRCNN = resnet(pascal_classes, 101, pretrained=False, class_agnostic=args.class_agnostic) - elif args.net == 'res50': - fasterRCNN = resnet(pascal_classes, 50, pretrained=False, class_agnostic=args.class_agnostic) - elif args.net == 'res152': - fasterRCNN = resnet(pascal_classes, 152, pretrained=False, class_agnostic=args.class_agnostic) - else: - print("network is not defined") - pdb.set_trace() - - fasterRCNN.create_architecture() - - print("load checkpoint %s" % (load_name)) - if args.cuda > 0: - checkpoint = torch.load(load_name) - else: - checkpoint = torch.load(load_name, map_location=(lambda storage, loc: storage)) - fasterRCNN.load_state_dict(checkpoint['model']) - if 'pooling_mode' in checkpoint.keys(): - cfg.POOLING_MODE = checkpoint['pooling_mode'] - - - print('load model successfully!') - - # pdb.set_trace() - - print("load checkpoint %s" % (load_name)) - - # initilize the tensor holder here. - im_data = torch.FloatTensor(1) - im_info = torch.FloatTensor(1) - num_boxes = torch.LongTensor(1) - gt_boxes = torch.FloatTensor(1) - - # ship to cuda - if args.cuda > 0: - im_data = im_data.cuda() - im_info = im_info.cuda() - num_boxes = num_boxes.cuda() - gt_boxes = gt_boxes.cuda() - - # make variable - im_data = Variable(im_data, volatile=True) - im_info = Variable(im_info, volatile=True) - num_boxes = Variable(num_boxes, volatile=True) - gt_boxes = Variable(gt_boxes, volatile=True) - - if args.cuda > 0: - cfg.CUDA = True - - if args.cuda > 0: - fasterRCNN.cuda() - - fasterRCNN.eval() - - start = time.time() - max_per_image = 100 - thresh = 0.05 - vis = True - - webcam_num = args.webcam_num - # Set up webcam or get image directories - if webcam_num >= 0 : - cap = cv2.VideoCapture(webcam_num) - num_images = 0 - else: - imglist = os.listdir(args.image_dir) - num_images = len(imglist) - - print('Loaded Photo: {} images.'.format(num_images)) - - - while (num_images >= 0): - total_tic = time.time() - if webcam_num == -1: - num_images -= 1 - - # Get image from the webcam - if webcam_num >= 0: - if not cap.isOpened(): - raise RuntimeError("Webcam could not open. Please check connection.") - ret, frame = cap.read() - im_in = np.array(frame) - # Load the demo image - else: - im_file = os.path.join(args.image_dir, imglist[num_images]) - # im = cv2.imread(im_file) - im_in = np.array(imread(im_file)) - if len(im_in.shape) == 2: - im_in = im_in[:,:,np.newaxis] - im_in = np.concatenate((im_in,im_in,im_in), axis=2) - # rgb -> bgr - im = im_in[:,:,::-1] - - blobs, im_scales = _get_image_blob(im) - assert len(im_scales) == 1, "Only single-image batch implemented" - im_blob = blobs - im_info_np = np.array([[im_blob.shape[1], im_blob.shape[2], im_scales[0]]], dtype=np.float32) - - im_data_pt = torch.from_numpy(im_blob) - im_data_pt = im_data_pt.permute(0, 3, 1, 2) - im_info_pt = torch.from_numpy(im_info_np) - - with torch.no_grad(): - im_data.resize_(im_data_pt.size()).copy_(im_data_pt) - im_info.resize_(im_info_pt.size()).copy_(im_info_pt) - gt_boxes.resize_(1, 1, 5).zero_() - num_boxes.resize_(1).zero_() - - # pdb.set_trace() - det_tic = time.time() - - rois, cls_prob, bbox_pred, \ - rpn_loss_cls, rpn_loss_box, \ - RCNN_loss_cls, RCNN_loss_bbox, \ - rois_label = fasterRCNN(im_data, im_info, gt_boxes, num_boxes) - - scores = cls_prob.data - boxes = rois.data[:, :, 1:5] - - if cfg.TEST.BBOX_REG: - # Apply bounding-box regression deltas - box_deltas = bbox_pred.data - if cfg.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED: - # Optionally normalize targets by a precomputed mean and stdev - if args.class_agnostic: - if args.cuda > 0: - box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS).cuda() \ - + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS).cuda() - else: - box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS) \ - + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS) - - box_deltas = box_deltas.view(1, -1, 4) - else: - if args.cuda > 0: - box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS).cuda() \ - + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS).cuda() - else: - box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS) \ - + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS) - box_deltas = box_deltas.view(1, -1, 4 * len(pascal_classes)) - - pred_boxes = bbox_transform_inv(boxes, box_deltas, 1) - pred_boxes = clip_boxes(pred_boxes, im_info.data, 1) - else: - # Simply repeat the boxes, once for each class - pred_boxes = np.tile(boxes, (1, scores.shape[1])) - - pred_boxes /= im_scales[0] - - scores = scores.squeeze() - pred_boxes = pred_boxes.squeeze() - det_toc = time.time() - detect_time = det_toc - det_tic - misc_tic = time.time() - if vis: - im2show = np.copy(im) - for j in xrange(1, len(pascal_classes)): - inds = torch.nonzero(scores[:,j]>thresh).view(-1) - # if there is det - if inds.numel() > 0: - cls_scores = scores[:,j][inds] - _, order = torch.sort(cls_scores, 0, True) - if args.class_agnostic: - cls_boxes = pred_boxes[inds, :] - else: - cls_boxes = pred_boxes[inds][:, j * 4:(j + 1) * 4] - - cls_dets = torch.cat((cls_boxes, cls_scores.unsqueeze(1)), 1) - # cls_dets = torch.cat((cls_boxes, cls_scores), 1) - cls_dets = cls_dets[order] - # keep = nms(cls_dets, cfg.TEST.NMS, force_cpu=not cfg.USE_GPU_NMS) - keep = nms(cls_boxes[order, :], cls_scores[order], cfg.TEST.NMS) - cls_dets = cls_dets[keep.view(-1).long()] - if vis: - im2show = vis_detections(im2show, pascal_classes[j], cls_dets.cpu().numpy(), 0.5) - - misc_toc = time.time() - nms_time = misc_toc - misc_tic - - if webcam_num == -1: - sys.stdout.write('im_detect: {:d}/{:d} {:.3f}s {:.3f}s \r' \ - .format(num_images + 1, len(imglist), detect_time, nms_time)) - sys.stdout.flush() - - if vis and webcam_num == -1: - # cv2.imshow('test', im2show) - # cv2.waitKey(0) - result_path = os.path.join(args.image_dir, imglist[num_images][:-4] + "_det.jpg") - cv2.imwrite(result_path, im2show) - else: - im2showRGB = cv2.cvtColor(im2show, cv2.COLOR_BGR2RGB) - cv2.imshow("frame", im2showRGB) - total_toc = time.time() - total_time = total_toc - total_tic - frame_rate = 1 / total_time - print('Frame rate:', frame_rate) - if cv2.waitKey(1) & 0xFF == ord('q'): - break - if webcam_num >= 0: - cap.release() - cv2.destroyAllWindows() diff --git a/lib/model/__init__.py b/faster_rcnn/__init__.py similarity index 100% rename from lib/model/__init__.py rename to faster_rcnn/__init__.py diff --git a/_init_paths.py b/faster_rcnn/_init_paths.py similarity index 85% rename from _init_paths.py rename to faster_rcnn/_init_paths.py index bdc926d28..0136d64c8 100644 --- a/_init_paths.py +++ b/faster_rcnn/_init_paths.py @@ -1,3 +1,4 @@ +import os import os.path as osp import sys @@ -9,6 +10,7 @@ def add_path(path): # Add lib to PYTHONPATH lib_path = osp.join(this_dir, 'lib') +assert os.path.isdir(lib_path), lib_path add_path(lib_path) coco_path = osp.join(this_dir, 'data', 'coco', 'PythonAPI') diff --git a/cfgs/res101.yml b/faster_rcnn/cfgs/res101.yml similarity index 100% rename from cfgs/res101.yml rename to faster_rcnn/cfgs/res101.yml diff --git a/cfgs/res101_ls.yml b/faster_rcnn/cfgs/res101_ls.yml similarity index 100% rename from cfgs/res101_ls.yml rename to faster_rcnn/cfgs/res101_ls.yml diff --git a/cfgs/res50.yml b/faster_rcnn/cfgs/res50.yml similarity index 100% rename from cfgs/res50.yml rename to faster_rcnn/cfgs/res50.yml diff --git a/cfgs/vgg16.yml b/faster_rcnn/cfgs/vgg16.yml similarity index 100% rename from cfgs/vgg16.yml rename to faster_rcnn/cfgs/vgg16.yml diff --git a/images/img1.jpg b/faster_rcnn/images/img1.jpg similarity index 100% rename from images/img1.jpg rename to faster_rcnn/images/img1.jpg diff --git a/images/img1_det.jpg b/faster_rcnn/images/img1_det.jpg similarity index 100% rename from images/img1_det.jpg rename to faster_rcnn/images/img1_det.jpg diff --git a/images/img1_det_res101.jpg b/faster_rcnn/images/img1_det_res101.jpg similarity index 100% rename from images/img1_det_res101.jpg rename to faster_rcnn/images/img1_det_res101.jpg diff --git a/images/img2.jpg b/faster_rcnn/images/img2.jpg similarity index 100% rename from images/img2.jpg rename to faster_rcnn/images/img2.jpg diff --git a/images/img2_det.jpg b/faster_rcnn/images/img2_det.jpg similarity index 100% rename from images/img2_det.jpg rename to faster_rcnn/images/img2_det.jpg diff --git a/images/img2_det_res101.jpg b/faster_rcnn/images/img2_det_res101.jpg similarity index 100% rename from images/img2_det_res101.jpg rename to faster_rcnn/images/img2_det_res101.jpg diff --git a/images/img3.jpg b/faster_rcnn/images/img3.jpg similarity index 100% rename from images/img3.jpg rename to faster_rcnn/images/img3.jpg diff --git a/images/img3_det.jpg b/faster_rcnn/images/img3_det.jpg similarity index 100% rename from images/img3_det.jpg rename to faster_rcnn/images/img3_det.jpg diff --git a/images/img3_det_res101.jpg b/faster_rcnn/images/img3_det_res101.jpg similarity index 100% rename from images/img3_det_res101.jpg rename to faster_rcnn/images/img3_det_res101.jpg diff --git a/images/img4.jpg b/faster_rcnn/images/img4.jpg similarity index 100% rename from images/img4.jpg rename to faster_rcnn/images/img4.jpg diff --git a/images/img4_det.jpg b/faster_rcnn/images/img4_det.jpg similarity index 100% rename from images/img4_det.jpg rename to faster_rcnn/images/img4_det.jpg diff --git a/images/img4_det_res101.jpg b/faster_rcnn/images/img4_det_res101.jpg similarity index 100% rename from images/img4_det_res101.jpg rename to faster_rcnn/images/img4_det_res101.jpg diff --git a/lib/model/faster_rcnn/__init__.py b/faster_rcnn/lib/__init__.py similarity index 100% rename from lib/model/faster_rcnn/__init__.py rename to faster_rcnn/lib/__init__.py diff --git a/lib/datasets/VOCdevkit-matlab-wrapper/get_voc_opts.m b/faster_rcnn/lib/datasets/VOCdevkit-matlab-wrapper/get_voc_opts.m similarity index 100% rename from lib/datasets/VOCdevkit-matlab-wrapper/get_voc_opts.m rename to faster_rcnn/lib/datasets/VOCdevkit-matlab-wrapper/get_voc_opts.m diff --git a/lib/datasets/VOCdevkit-matlab-wrapper/voc_eval.m b/faster_rcnn/lib/datasets/VOCdevkit-matlab-wrapper/voc_eval.m similarity index 100% rename from lib/datasets/VOCdevkit-matlab-wrapper/voc_eval.m rename to faster_rcnn/lib/datasets/VOCdevkit-matlab-wrapper/voc_eval.m diff --git a/lib/datasets/VOCdevkit-matlab-wrapper/xVOCap.m b/faster_rcnn/lib/datasets/VOCdevkit-matlab-wrapper/xVOCap.m similarity index 100% rename from lib/datasets/VOCdevkit-matlab-wrapper/xVOCap.m rename to faster_rcnn/lib/datasets/VOCdevkit-matlab-wrapper/xVOCap.m diff --git a/lib/datasets/__init__.py b/faster_rcnn/lib/datasets/__init__.py similarity index 100% rename from lib/datasets/__init__.py rename to faster_rcnn/lib/datasets/__init__.py diff --git a/lib/datasets/coco.py b/faster_rcnn/lib/datasets/coco.py similarity index 99% rename from lib/datasets/coco.py rename to faster_rcnn/lib/datasets/coco.py index 97df5976d..0dd7cd0b6 100644 --- a/lib/datasets/coco.py +++ b/faster_rcnn/lib/datasets/coco.py @@ -9,7 +9,7 @@ from datasets.imdb import imdb import datasets.ds_utils as ds_utils -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg import os.path as osp import sys import os diff --git a/lib/datasets/ds_utils.py b/faster_rcnn/lib/datasets/ds_utils.py similarity index 100% rename from lib/datasets/ds_utils.py rename to faster_rcnn/lib/datasets/ds_utils.py diff --git a/lib/datasets/factory.py b/faster_rcnn/lib/datasets/factory.py similarity index 100% rename from lib/datasets/factory.py rename to faster_rcnn/lib/datasets/factory.py diff --git a/lib/datasets/imagenet.py b/faster_rcnn/lib/datasets/imagenet.py similarity index 100% rename from lib/datasets/imagenet.py rename to faster_rcnn/lib/datasets/imagenet.py diff --git a/lib/datasets/imdb.py b/faster_rcnn/lib/datasets/imdb.py similarity index 98% rename from lib/datasets/imdb.py rename to faster_rcnn/lib/datasets/imdb.py index 06dfbe556..cec59e195 100644 --- a/lib/datasets/imdb.py +++ b/faster_rcnn/lib/datasets/imdb.py @@ -11,10 +11,10 @@ import os import os.path as osp import PIL -# from model.utils.cython_bbox import bbox_overlaps +# from faster_rcnn.lib.model.utils.cython_bbox import bbox_overlaps import numpy as np import scipy.sparse -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg import pdb ROOT_DIR = osp.join(osp.dirname(__file__), '..', '..') diff --git a/lib/datasets/pascal_voc.py b/faster_rcnn/lib/datasets/pascal_voc.py similarity index 99% rename from lib/datasets/pascal_voc.py rename to faster_rcnn/lib/datasets/pascal_voc.py index 7a29bd9d2..3cb0bb505 100644 --- a/lib/datasets/pascal_voc.py +++ b/faster_rcnn/lib/datasets/pascal_voc.py @@ -27,7 +27,7 @@ # TODO: make fast_rcnn irrelevant # >>>> obsolete, because it depends on sth outside of this project -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg try: xrange # Python 2 diff --git a/lib/datasets/pascal_voc_rbg.py b/faster_rcnn/lib/datasets/pascal_voc_rbg.py similarity index 99% rename from lib/datasets/pascal_voc_rbg.py rename to faster_rcnn/lib/datasets/pascal_voc_rbg.py index 23b42240b..f98a17b27 100644 --- a/lib/datasets/pascal_voc_rbg.py +++ b/faster_rcnn/lib/datasets/pascal_voc_rbg.py @@ -20,7 +20,7 @@ import subprocess import uuid from .voc_eval import voc_eval -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg import pdb diff --git a/lib/datasets/tools/mcg_munge.py b/faster_rcnn/lib/datasets/tools/mcg_munge.py similarity index 100% rename from lib/datasets/tools/mcg_munge.py rename to faster_rcnn/lib/datasets/tools/mcg_munge.py diff --git a/lib/datasets/vg.py b/faster_rcnn/lib/datasets/vg.py similarity index 99% rename from lib/datasets/vg.py rename to faster_rcnn/lib/datasets/vg.py index 3c1a1a38b..57e7f6e76 100755 --- a/lib/datasets/vg.py +++ b/faster_rcnn/lib/datasets/vg.py @@ -17,7 +17,7 @@ import PIL import json from .vg_eval import vg_eval -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg import pickle import pdb try: diff --git a/lib/datasets/vg_eval.py b/faster_rcnn/lib/datasets/vg_eval.py similarity index 100% rename from lib/datasets/vg_eval.py rename to faster_rcnn/lib/datasets/vg_eval.py diff --git a/lib/datasets/voc_eval.py b/faster_rcnn/lib/datasets/voc_eval.py similarity index 100% rename from lib/datasets/voc_eval.py rename to faster_rcnn/lib/datasets/voc_eval.py diff --git a/lib/model/nms/__init__.py b/faster_rcnn/lib/model/__init__.py similarity index 100% rename from lib/model/nms/__init__.py rename to faster_rcnn/lib/model/__init__.py diff --git a/lib/model/csrc/ROIAlign.h b/faster_rcnn/lib/model/csrc/ROIAlign.h similarity index 100% rename from lib/model/csrc/ROIAlign.h rename to faster_rcnn/lib/model/csrc/ROIAlign.h diff --git a/lib/model/csrc/ROIPool.h b/faster_rcnn/lib/model/csrc/ROIPool.h similarity index 100% rename from lib/model/csrc/ROIPool.h rename to faster_rcnn/lib/model/csrc/ROIPool.h diff --git a/lib/model/csrc/cpu/ROIAlign_cpu.cpp b/faster_rcnn/lib/model/csrc/cpu/ROIAlign_cpu.cpp similarity index 100% rename from lib/model/csrc/cpu/ROIAlign_cpu.cpp rename to faster_rcnn/lib/model/csrc/cpu/ROIAlign_cpu.cpp diff --git a/lib/model/csrc/cpu/nms_cpu.cpp b/faster_rcnn/lib/model/csrc/cpu/nms_cpu.cpp similarity index 100% rename from lib/model/csrc/cpu/nms_cpu.cpp rename to faster_rcnn/lib/model/csrc/cpu/nms_cpu.cpp diff --git a/lib/model/csrc/cpu/vision.h b/faster_rcnn/lib/model/csrc/cpu/vision.h similarity index 100% rename from lib/model/csrc/cpu/vision.h rename to faster_rcnn/lib/model/csrc/cpu/vision.h diff --git a/lib/model/csrc/cuda/ROIAlign_cuda.cu b/faster_rcnn/lib/model/csrc/cuda/ROIAlign_cuda.cu similarity index 100% rename from lib/model/csrc/cuda/ROIAlign_cuda.cu rename to faster_rcnn/lib/model/csrc/cuda/ROIAlign_cuda.cu diff --git a/lib/model/csrc/cuda/ROIPool_cuda.cu b/faster_rcnn/lib/model/csrc/cuda/ROIPool_cuda.cu similarity index 100% rename from lib/model/csrc/cuda/ROIPool_cuda.cu rename to faster_rcnn/lib/model/csrc/cuda/ROIPool_cuda.cu diff --git a/lib/model/csrc/cuda/nms.cu b/faster_rcnn/lib/model/csrc/cuda/nms.cu similarity index 100% rename from lib/model/csrc/cuda/nms.cu rename to faster_rcnn/lib/model/csrc/cuda/nms.cu diff --git a/lib/model/csrc/cuda/vision.h b/faster_rcnn/lib/model/csrc/cuda/vision.h similarity index 100% rename from lib/model/csrc/cuda/vision.h rename to faster_rcnn/lib/model/csrc/cuda/vision.h diff --git a/lib/model/csrc/nms.h b/faster_rcnn/lib/model/csrc/nms.h similarity index 100% rename from lib/model/csrc/nms.h rename to faster_rcnn/lib/model/csrc/nms.h diff --git a/lib/model/csrc/vision.cpp b/faster_rcnn/lib/model/csrc/vision.cpp similarity index 100% rename from lib/model/csrc/vision.cpp rename to faster_rcnn/lib/model/csrc/vision.cpp diff --git a/lib/model/nms/_ext/__init__.py b/faster_rcnn/lib/model/faster_rcnn/__init__.py similarity index 100% rename from lib/model/nms/_ext/__init__.py rename to faster_rcnn/lib/model/faster_rcnn/__init__.py diff --git a/lib/model/faster_rcnn/faster_rcnn.py b/faster_rcnn/lib/model/faster_rcnn/faster_rcnn.py similarity index 90% rename from lib/model/faster_rcnn/faster_rcnn.py rename to faster_rcnn/lib/model/faster_rcnn/faster_rcnn.py index 649616260..a2b21b438 100644 --- a/lib/model/faster_rcnn/faster_rcnn.py +++ b/faster_rcnn/lib/model/faster_rcnn/faster_rcnn.py @@ -6,18 +6,18 @@ import torchvision.models as models from torch.autograd import Variable import numpy as np -from model.utils.config import cfg -from model.rpn.rpn import _RPN +from faster_rcnn.lib.model.utils.config import cfg +from faster_rcnn.lib.model.rpn.rpn import _RPN -from model.roi_layers import ROIAlign, ROIPool +from faster_rcnn.lib.model.roi_layers import ROIAlign, ROIPool -# from model.roi_pooling.modules.roi_pool import _RoIPooling -# from model.roi_align.modules.roi_align import RoIAlignAvg +# from faster_rcnn.lib.model.roi_pooling.modules.roi_pool import _RoIPooling +# from faster_rcnn.lib.model.roi_align.modules.roi_align import RoIAlignAvg -from model.rpn.proposal_target_layer_cascade import _ProposalTargetLayer +from faster_rcnn.lib.model.rpn.proposal_target_layer_cascade import _ProposalTargetLayer import time import pdb -from model.utils.net_utils import _smooth_l1_loss, _crop_pool_layer, _affine_grid_gen, _affine_theta +from faster_rcnn.lib.model.utils.net_utils import _smooth_l1_loss, _crop_pool_layer, _affine_grid_gen, _affine_theta class _fasterRCNN(nn.Module): """ faster RCNN """ diff --git a/lib/model/faster_rcnn/resnet.py b/faster_rcnn/lib/model/faster_rcnn/resnet.py similarity index 98% rename from lib/model/faster_rcnn/resnet.py rename to faster_rcnn/lib/model/faster_rcnn/resnet.py index 5457724b3..f27bad836 100644 --- a/lib/model/faster_rcnn/resnet.py +++ b/faster_rcnn/lib/model/faster_rcnn/resnet.py @@ -2,8 +2,8 @@ from __future__ import division from __future__ import print_function -from model.utils.config import cfg -from model.faster_rcnn.faster_rcnn import _fasterRCNN +from faster_rcnn.lib.model.utils.config import cfg +from faster_rcnn.lib.model.faster_rcnn.faster_rcnn import _fasterRCNN import torch import torch.nn as nn diff --git a/lib/model/faster_rcnn/vgg16.py b/faster_rcnn/lib/model/faster_rcnn/vgg16.py similarity index 93% rename from lib/model/faster_rcnn/vgg16.py rename to faster_rcnn/lib/model/faster_rcnn/vgg16.py index 90fe0d7b9..bb6812665 100644 --- a/lib/model/faster_rcnn/vgg16.py +++ b/faster_rcnn/lib/model/faster_rcnn/vgg16.py @@ -13,7 +13,7 @@ from torch.autograd import Variable import math import torchvision.models as models -from model.faster_rcnn.faster_rcnn import _fasterRCNN +from faster_rcnn.lib.model.faster_rcnn.faster_rcnn import _fasterRCNN import pdb class vgg16(_fasterRCNN): @@ -51,10 +51,10 @@ def _init_modules(self): if self.class_agnostic: self.RCNN_bbox_pred = nn.Linear(4096, 4) else: - self.RCNN_bbox_pred = nn.Linear(4096, 4 * self.n_classes) + self.RCNN_bbox_pred = nn.Linear(4096, 4 * self.n_classes) def _head_to_tail(self, pool5): - + pool5_flat = pool5.view(pool5.size(0), -1) fc7 = self.RCNN_top(pool5_flat) diff --git a/lib/model/nms/.gitignore b/faster_rcnn/lib/model/nms/.gitignore similarity index 100% rename from lib/model/nms/.gitignore rename to faster_rcnn/lib/model/nms/.gitignore diff --git a/lib/model/roi_align/__init__.py b/faster_rcnn/lib/model/nms/__init__.py similarity index 100% rename from lib/model/roi_align/__init__.py rename to faster_rcnn/lib/model/nms/__init__.py diff --git a/lib/model/roi_align/_ext/__init__.py b/faster_rcnn/lib/model/nms/_ext/__init__.py similarity index 100% rename from lib/model/roi_align/_ext/__init__.py rename to faster_rcnn/lib/model/nms/_ext/__init__.py diff --git a/lib/model/nms/_ext/nms/__init__.py b/faster_rcnn/lib/model/nms/_ext/nms/__init__.py similarity index 100% rename from lib/model/nms/_ext/nms/__init__.py rename to faster_rcnn/lib/model/nms/_ext/nms/__init__.py diff --git a/lib/model/nms/build.py b/faster_rcnn/lib/model/nms/build.py similarity index 100% rename from lib/model/nms/build.py rename to faster_rcnn/lib/model/nms/build.py diff --git a/lib/model/nms/make.sh b/faster_rcnn/lib/model/nms/make.sh similarity index 100% rename from lib/model/nms/make.sh rename to faster_rcnn/lib/model/nms/make.sh diff --git a/lib/model/nms/nms_cpu.py b/faster_rcnn/lib/model/nms/nms_cpu.py similarity index 100% rename from lib/model/nms/nms_cpu.py rename to faster_rcnn/lib/model/nms/nms_cpu.py diff --git a/lib/model/nms/nms_gpu.py b/faster_rcnn/lib/model/nms/nms_gpu.py similarity index 100% rename from lib/model/nms/nms_gpu.py rename to faster_rcnn/lib/model/nms/nms_gpu.py diff --git a/lib/model/nms/nms_kernel.cu b/faster_rcnn/lib/model/nms/nms_kernel.cu similarity index 100% rename from lib/model/nms/nms_kernel.cu rename to faster_rcnn/lib/model/nms/nms_kernel.cu diff --git a/lib/model/nms/nms_wrapper.py b/faster_rcnn/lib/model/nms/nms_wrapper.py similarity index 79% rename from lib/model/nms/nms_wrapper.py rename to faster_rcnn/lib/model/nms/nms_wrapper.py index 5ae36602b..94a400fd1 100644 --- a/lib/model/nms/nms_wrapper.py +++ b/faster_rcnn/lib/model/nms/nms_wrapper.py @@ -5,10 +5,10 @@ # Written by Ross Girshick # -------------------------------------------------------- import torch -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg if torch.cuda.is_available(): - from model.nms.nms_gpu import nms_gpu -from model.nms.nms_cpu import nms_cpu + from faster_rcnn.lib.model.nms.nms_gpu import nms_gpu +from faster_rcnn.lib.model.nms.nms_cpu import nms_cpu def nms(dets, thresh, force_cpu=False): """Dispatch to either CPU or GPU NMS implementations.""" diff --git a/lib/model/nms/src/nms_cuda.h b/faster_rcnn/lib/model/nms/src/nms_cuda.h similarity index 100% rename from lib/model/nms/src/nms_cuda.h rename to faster_rcnn/lib/model/nms/src/nms_cuda.h diff --git a/lib/model/nms/src/nms_cuda_kernel.cu b/faster_rcnn/lib/model/nms/src/nms_cuda_kernel.cu similarity index 100% rename from lib/model/nms/src/nms_cuda_kernel.cu rename to faster_rcnn/lib/model/nms/src/nms_cuda_kernel.cu diff --git a/lib/model/nms/src/nms_cuda_kernel.h b/faster_rcnn/lib/model/nms/src/nms_cuda_kernel.h similarity index 100% rename from lib/model/nms/src/nms_cuda_kernel.h rename to faster_rcnn/lib/model/nms/src/nms_cuda_kernel.h diff --git a/lib/model/roi_align/functions/__init__.py b/faster_rcnn/lib/model/roi_align/__init__.py similarity index 100% rename from lib/model/roi_align/functions/__init__.py rename to faster_rcnn/lib/model/roi_align/__init__.py diff --git a/lib/model/roi_align/modules/__init__.py b/faster_rcnn/lib/model/roi_align/_ext/__init__.py similarity index 100% rename from lib/model/roi_align/modules/__init__.py rename to faster_rcnn/lib/model/roi_align/_ext/__init__.py diff --git a/lib/model/roi_align/_ext/roi_align/__init__.py b/faster_rcnn/lib/model/roi_align/_ext/roi_align/__init__.py similarity index 100% rename from lib/model/roi_align/_ext/roi_align/__init__.py rename to faster_rcnn/lib/model/roi_align/_ext/roi_align/__init__.py diff --git a/lib/model/roi_align/build.py b/faster_rcnn/lib/model/roi_align/build.py similarity index 100% rename from lib/model/roi_align/build.py rename to faster_rcnn/lib/model/roi_align/build.py diff --git a/lib/model/roi_crop/__init__.py b/faster_rcnn/lib/model/roi_align/functions/__init__.py similarity index 100% rename from lib/model/roi_crop/__init__.py rename to faster_rcnn/lib/model/roi_align/functions/__init__.py diff --git a/lib/model/roi_align/functions/roi_align.py b/faster_rcnn/lib/model/roi_align/functions/roi_align.py similarity index 100% rename from lib/model/roi_align/functions/roi_align.py rename to faster_rcnn/lib/model/roi_align/functions/roi_align.py diff --git a/lib/model/roi_align/make.sh b/faster_rcnn/lib/model/roi_align/make.sh similarity index 100% rename from lib/model/roi_align/make.sh rename to faster_rcnn/lib/model/roi_align/make.sh diff --git a/lib/model/roi_crop/_ext/__init__.py b/faster_rcnn/lib/model/roi_align/modules/__init__.py similarity index 100% rename from lib/model/roi_crop/_ext/__init__.py rename to faster_rcnn/lib/model/roi_align/modules/__init__.py diff --git a/lib/model/roi_align/modules/roi_align.py b/faster_rcnn/lib/model/roi_align/modules/roi_align.py similarity index 100% rename from lib/model/roi_align/modules/roi_align.py rename to faster_rcnn/lib/model/roi_align/modules/roi_align.py diff --git a/lib/model/roi_align/src/roi_align.c b/faster_rcnn/lib/model/roi_align/src/roi_align.c similarity index 100% rename from lib/model/roi_align/src/roi_align.c rename to faster_rcnn/lib/model/roi_align/src/roi_align.c diff --git a/lib/model/roi_align/src/roi_align.h b/faster_rcnn/lib/model/roi_align/src/roi_align.h similarity index 100% rename from lib/model/roi_align/src/roi_align.h rename to faster_rcnn/lib/model/roi_align/src/roi_align.h diff --git a/lib/model/roi_align/src/roi_align_cuda.c b/faster_rcnn/lib/model/roi_align/src/roi_align_cuda.c similarity index 100% rename from lib/model/roi_align/src/roi_align_cuda.c rename to faster_rcnn/lib/model/roi_align/src/roi_align_cuda.c diff --git a/lib/model/roi_align/src/roi_align_cuda.h b/faster_rcnn/lib/model/roi_align/src/roi_align_cuda.h similarity index 100% rename from lib/model/roi_align/src/roi_align_cuda.h rename to faster_rcnn/lib/model/roi_align/src/roi_align_cuda.h diff --git a/lib/model/roi_align/src/roi_align_kernel.cu b/faster_rcnn/lib/model/roi_align/src/roi_align_kernel.cu similarity index 100% rename from lib/model/roi_align/src/roi_align_kernel.cu rename to faster_rcnn/lib/model/roi_align/src/roi_align_kernel.cu diff --git a/lib/model/roi_align/src/roi_align_kernel.h b/faster_rcnn/lib/model/roi_align/src/roi_align_kernel.h similarity index 100% rename from lib/model/roi_align/src/roi_align_kernel.h rename to faster_rcnn/lib/model/roi_align/src/roi_align_kernel.h diff --git a/lib/model/roi_crop/functions/__init__.py b/faster_rcnn/lib/model/roi_crop/__init__.py similarity index 100% rename from lib/model/roi_crop/functions/__init__.py rename to faster_rcnn/lib/model/roi_crop/__init__.py diff --git a/lib/model/roi_crop/modules/__init__.py b/faster_rcnn/lib/model/roi_crop/_ext/__init__.py similarity index 100% rename from lib/model/roi_crop/modules/__init__.py rename to faster_rcnn/lib/model/roi_crop/_ext/__init__.py diff --git a/lib/model/roi_crop/_ext/crop_resize/__init__.py b/faster_rcnn/lib/model/roi_crop/_ext/crop_resize/__init__.py similarity index 100% rename from lib/model/roi_crop/_ext/crop_resize/__init__.py rename to faster_rcnn/lib/model/roi_crop/_ext/crop_resize/__init__.py diff --git a/lib/model/roi_crop/_ext/roi_crop/__init__.py b/faster_rcnn/lib/model/roi_crop/_ext/roi_crop/__init__.py similarity index 100% rename from lib/model/roi_crop/_ext/roi_crop/__init__.py rename to faster_rcnn/lib/model/roi_crop/_ext/roi_crop/__init__.py diff --git a/lib/model/roi_crop/build.py b/faster_rcnn/lib/model/roi_crop/build.py similarity index 100% rename from lib/model/roi_crop/build.py rename to faster_rcnn/lib/model/roi_crop/build.py diff --git a/lib/model/roi_pooling/__init__.py b/faster_rcnn/lib/model/roi_crop/functions/__init__.py similarity index 100% rename from lib/model/roi_pooling/__init__.py rename to faster_rcnn/lib/model/roi_crop/functions/__init__.py diff --git a/lib/model/roi_crop/functions/crop_resize.py b/faster_rcnn/lib/model/roi_crop/functions/crop_resize.py similarity index 100% rename from lib/model/roi_crop/functions/crop_resize.py rename to faster_rcnn/lib/model/roi_crop/functions/crop_resize.py diff --git a/lib/model/roi_crop/functions/gridgen.py b/faster_rcnn/lib/model/roi_crop/functions/gridgen.py similarity index 100% rename from lib/model/roi_crop/functions/gridgen.py rename to faster_rcnn/lib/model/roi_crop/functions/gridgen.py diff --git a/lib/model/roi_crop/functions/roi_crop.py b/faster_rcnn/lib/model/roi_crop/functions/roi_crop.py similarity index 100% rename from lib/model/roi_crop/functions/roi_crop.py rename to faster_rcnn/lib/model/roi_crop/functions/roi_crop.py diff --git a/lib/model/roi_crop/make.sh b/faster_rcnn/lib/model/roi_crop/make.sh similarity index 100% rename from lib/model/roi_crop/make.sh rename to faster_rcnn/lib/model/roi_crop/make.sh diff --git a/lib/model/roi_pooling/_ext/__init__.py b/faster_rcnn/lib/model/roi_crop/modules/__init__.py similarity index 100% rename from lib/model/roi_pooling/_ext/__init__.py rename to faster_rcnn/lib/model/roi_crop/modules/__init__.py diff --git a/lib/model/roi_crop/modules/gridgen.py b/faster_rcnn/lib/model/roi_crop/modules/gridgen.py similarity index 100% rename from lib/model/roi_crop/modules/gridgen.py rename to faster_rcnn/lib/model/roi_crop/modules/gridgen.py diff --git a/lib/model/roi_crop/modules/roi_crop.py b/faster_rcnn/lib/model/roi_crop/modules/roi_crop.py similarity index 100% rename from lib/model/roi_crop/modules/roi_crop.py rename to faster_rcnn/lib/model/roi_crop/modules/roi_crop.py diff --git a/lib/model/roi_crop/src/roi_crop.c b/faster_rcnn/lib/model/roi_crop/src/roi_crop.c similarity index 100% rename from lib/model/roi_crop/src/roi_crop.c rename to faster_rcnn/lib/model/roi_crop/src/roi_crop.c diff --git a/lib/model/roi_crop/src/roi_crop.h b/faster_rcnn/lib/model/roi_crop/src/roi_crop.h similarity index 100% rename from lib/model/roi_crop/src/roi_crop.h rename to faster_rcnn/lib/model/roi_crop/src/roi_crop.h diff --git a/lib/model/roi_crop/src/roi_crop_cuda.c b/faster_rcnn/lib/model/roi_crop/src/roi_crop_cuda.c similarity index 100% rename from lib/model/roi_crop/src/roi_crop_cuda.c rename to faster_rcnn/lib/model/roi_crop/src/roi_crop_cuda.c diff --git a/lib/model/roi_crop/src/roi_crop_cuda.h b/faster_rcnn/lib/model/roi_crop/src/roi_crop_cuda.h similarity index 100% rename from lib/model/roi_crop/src/roi_crop_cuda.h rename to faster_rcnn/lib/model/roi_crop/src/roi_crop_cuda.h diff --git a/lib/model/roi_crop/src/roi_crop_cuda_kernel.cu b/faster_rcnn/lib/model/roi_crop/src/roi_crop_cuda_kernel.cu similarity index 100% rename from lib/model/roi_crop/src/roi_crop_cuda_kernel.cu rename to faster_rcnn/lib/model/roi_crop/src/roi_crop_cuda_kernel.cu diff --git a/lib/model/roi_crop/src/roi_crop_cuda_kernel.h b/faster_rcnn/lib/model/roi_crop/src/roi_crop_cuda_kernel.h similarity index 100% rename from lib/model/roi_crop/src/roi_crop_cuda_kernel.h rename to faster_rcnn/lib/model/roi_crop/src/roi_crop_cuda_kernel.h diff --git a/lib/model/roi_layers/__init__.py b/faster_rcnn/lib/model/roi_layers/__init__.py similarity index 100% rename from lib/model/roi_layers/__init__.py rename to faster_rcnn/lib/model/roi_layers/__init__.py diff --git a/lib/model/roi_layers/nms.py b/faster_rcnn/lib/model/roi_layers/nms.py similarity index 83% rename from lib/model/roi_layers/nms.py rename to faster_rcnn/lib/model/roi_layers/nms.py index c0de3f32d..0df1e787c 100644 --- a/lib/model/roi_layers/nms.py +++ b/faster_rcnn/lib/model/roi_layers/nms.py @@ -1,6 +1,6 @@ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. # from ._utils import _C -from model import _C +from faster_rcnn.lib.model import _C nms = _C.nms # nms.__doc__ = """ diff --git a/lib/model/roi_layers/roi_align.py b/faster_rcnn/lib/model/roi_layers/roi_align.py similarity index 98% rename from lib/model/roi_layers/roi_align.py rename to faster_rcnn/lib/model/roi_layers/roi_align.py index 10a448744..f6012f218 100644 --- a/lib/model/roi_layers/roi_align.py +++ b/faster_rcnn/lib/model/roi_layers/roi_align.py @@ -5,7 +5,7 @@ from torch.autograd.function import once_differentiable from torch.nn.modules.utils import _pair -from model import _C +from faster_rcnn.lib.model import _C import pdb diff --git a/lib/model/roi_layers/roi_pool.py b/faster_rcnn/lib/model/roi_layers/roi_pool.py similarity index 98% rename from lib/model/roi_layers/roi_pool.py rename to faster_rcnn/lib/model/roi_layers/roi_pool.py index e9e6e1069..62d82b6bf 100644 --- a/lib/model/roi_layers/roi_pool.py +++ b/faster_rcnn/lib/model/roi_layers/roi_pool.py @@ -5,7 +5,7 @@ from torch.autograd.function import once_differentiable from torch.nn.modules.utils import _pair -from model import _C +from faster_rcnn.lib.model import _C class _ROIPool(Function): diff --git a/lib/model/roi_pooling/functions/__init__.py b/faster_rcnn/lib/model/roi_pooling/__init__.py similarity index 100% rename from lib/model/roi_pooling/functions/__init__.py rename to faster_rcnn/lib/model/roi_pooling/__init__.py diff --git a/lib/model/roi_pooling/modules/__init__.py b/faster_rcnn/lib/model/roi_pooling/_ext/__init__.py similarity index 100% rename from lib/model/roi_pooling/modules/__init__.py rename to faster_rcnn/lib/model/roi_pooling/_ext/__init__.py diff --git a/lib/model/roi_pooling/_ext/roi_pooling/__init__.py b/faster_rcnn/lib/model/roi_pooling/_ext/roi_pooling/__init__.py similarity index 100% rename from lib/model/roi_pooling/_ext/roi_pooling/__init__.py rename to faster_rcnn/lib/model/roi_pooling/_ext/roi_pooling/__init__.py diff --git a/lib/model/roi_pooling/build.py b/faster_rcnn/lib/model/roi_pooling/build.py similarity index 100% rename from lib/model/roi_pooling/build.py rename to faster_rcnn/lib/model/roi_pooling/build.py diff --git a/lib/model/rpn/__init__.py b/faster_rcnn/lib/model/roi_pooling/functions/__init__.py similarity index 100% rename from lib/model/rpn/__init__.py rename to faster_rcnn/lib/model/roi_pooling/functions/__init__.py diff --git a/lib/model/roi_pooling/functions/roi_pool.py b/faster_rcnn/lib/model/roi_pooling/functions/roi_pool.py similarity index 100% rename from lib/model/roi_pooling/functions/roi_pool.py rename to faster_rcnn/lib/model/roi_pooling/functions/roi_pool.py diff --git a/lib/model/utils/__init__.py b/faster_rcnn/lib/model/roi_pooling/modules/__init__.py similarity index 100% rename from lib/model/utils/__init__.py rename to faster_rcnn/lib/model/roi_pooling/modules/__init__.py diff --git a/lib/model/roi_pooling/modules/roi_pool.py b/faster_rcnn/lib/model/roi_pooling/modules/roi_pool.py similarity index 100% rename from lib/model/roi_pooling/modules/roi_pool.py rename to faster_rcnn/lib/model/roi_pooling/modules/roi_pool.py diff --git a/lib/model/roi_pooling/src/roi_pooling.c b/faster_rcnn/lib/model/roi_pooling/src/roi_pooling.c similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling.c rename to faster_rcnn/lib/model/roi_pooling/src/roi_pooling.c diff --git a/lib/model/roi_pooling/src/roi_pooling.h b/faster_rcnn/lib/model/roi_pooling/src/roi_pooling.h similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling.h rename to faster_rcnn/lib/model/roi_pooling/src/roi_pooling.h diff --git a/lib/model/roi_pooling/src/roi_pooling_cuda.c b/faster_rcnn/lib/model/roi_pooling/src/roi_pooling_cuda.c similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling_cuda.c rename to faster_rcnn/lib/model/roi_pooling/src/roi_pooling_cuda.c diff --git a/lib/model/roi_pooling/src/roi_pooling_cuda.h b/faster_rcnn/lib/model/roi_pooling/src/roi_pooling_cuda.h similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling_cuda.h rename to faster_rcnn/lib/model/roi_pooling/src/roi_pooling_cuda.h diff --git a/lib/model/roi_pooling/src/roi_pooling_kernel.cu b/faster_rcnn/lib/model/roi_pooling/src/roi_pooling_kernel.cu similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling_kernel.cu rename to faster_rcnn/lib/model/roi_pooling/src/roi_pooling_kernel.cu diff --git a/lib/model/roi_pooling/src/roi_pooling_kernel.h b/faster_rcnn/lib/model/roi_pooling/src/roi_pooling_kernel.h similarity index 100% rename from lib/model/roi_pooling/src/roi_pooling_kernel.h rename to faster_rcnn/lib/model/roi_pooling/src/roi_pooling_kernel.h diff --git a/faster_rcnn/lib/model/rpn/__init__.py b/faster_rcnn/lib/model/rpn/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/model/rpn/anchor_target_layer.py b/faster_rcnn/lib/model/rpn/anchor_target_layer.py similarity index 99% rename from lib/model/rpn/anchor_target_layer.py rename to faster_rcnn/lib/model/rpn/anchor_target_layer.py index ba00ad56b..9a82989ac 100644 --- a/lib/model/rpn/anchor_target_layer.py +++ b/faster_rcnn/lib/model/rpn/anchor_target_layer.py @@ -14,7 +14,7 @@ import numpy as np import numpy.random as npr -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg from .generate_anchors import generate_anchors from .bbox_transform import clip_boxes, bbox_overlaps_batch, bbox_transform_batch diff --git a/lib/model/rpn/bbox_transform.py b/faster_rcnn/lib/model/rpn/bbox_transform.py similarity index 100% rename from lib/model/rpn/bbox_transform.py rename to faster_rcnn/lib/model/rpn/bbox_transform.py diff --git a/lib/model/rpn/generate_anchors.py b/faster_rcnn/lib/model/rpn/generate_anchors.py similarity index 100% rename from lib/model/rpn/generate_anchors.py rename to faster_rcnn/lib/model/rpn/generate_anchors.py diff --git a/lib/model/rpn/proposal_layer.py b/faster_rcnn/lib/model/rpn/proposal_layer.py similarity index 97% rename from lib/model/rpn/proposal_layer.py rename to faster_rcnn/lib/model/rpn/proposal_layer.py index 9c787da91..81580de28 100644 --- a/lib/model/rpn/proposal_layer.py +++ b/faster_rcnn/lib/model/rpn/proposal_layer.py @@ -14,11 +14,11 @@ import numpy as np import math import yaml -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg from .generate_anchors import generate_anchors from .bbox_transform import bbox_transform_inv, clip_boxes, clip_boxes_batch -# from model.nms.nms_wrapper import nms -from model.roi_layers import nms +# from faster_rcnn.lib.model.nms.nms_wrapper import nms +from faster_rcnn.lib.model.roi_layers import nms import pdb DEBUG = False diff --git a/lib/model/rpn/proposal_target_layer_cascade.py b/faster_rcnn/lib/model/rpn/proposal_target_layer_cascade.py similarity index 100% rename from lib/model/rpn/proposal_target_layer_cascade.py rename to faster_rcnn/lib/model/rpn/proposal_target_layer_cascade.py diff --git a/lib/model/rpn/rpn.py b/faster_rcnn/lib/model/rpn/rpn.py similarity index 97% rename from lib/model/rpn/rpn.py rename to faster_rcnn/lib/model/rpn/rpn.py index 29bdaadb3..504fa799b 100644 --- a/lib/model/rpn/rpn.py +++ b/faster_rcnn/lib/model/rpn/rpn.py @@ -4,10 +4,10 @@ import torch.nn.functional as F from torch.autograd import Variable -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg from .proposal_layer import _ProposalLayer from .anchor_target_layer import _AnchorTargetLayer -from model.utils.net_utils import _smooth_l1_loss +from faster_rcnn.lib.model.utils.net_utils import _smooth_l1_loss import numpy as np import math @@ -18,7 +18,7 @@ class _RPN(nn.Module): """ region proposal network """ def __init__(self, din): super(_RPN, self).__init__() - + self.din = din # get depth of input feature map, e.g., 512 self.anchor_scales = cfg.ANCHOR_SCALES self.anchor_ratios = cfg.ANCHOR_RATIOS diff --git a/lib/model/utils/.gitignore b/faster_rcnn/lib/model/utils/.gitignore similarity index 100% rename from lib/model/utils/.gitignore rename to faster_rcnn/lib/model/utils/.gitignore diff --git a/faster_rcnn/lib/model/utils/__init__.py b/faster_rcnn/lib/model/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/model/utils/bbox.pyx b/faster_rcnn/lib/model/utils/bbox.pyx similarity index 100% rename from lib/model/utils/bbox.pyx rename to faster_rcnn/lib/model/utils/bbox.pyx diff --git a/lib/model/utils/blob.py b/faster_rcnn/lib/model/utils/blob.py similarity index 97% rename from lib/model/utils/blob.py rename to faster_rcnn/lib/model/utils/blob.py index 48b233249..21f2f78bf 100644 --- a/lib/model/utils/blob.py +++ b/faster_rcnn/lib/model/utils/blob.py @@ -8,7 +8,7 @@ """Blob helper functions.""" import numpy as np -# from scipy.misc import imread, imresize +# from imageio import imread, imresize import cv2 try: diff --git a/lib/model/utils/config.py b/faster_rcnn/lib/model/utils/config.py similarity index 100% rename from lib/model/utils/config.py rename to faster_rcnn/lib/model/utils/config.py diff --git a/lib/model/utils/logger.py b/faster_rcnn/lib/model/utils/logger.py similarity index 100% rename from lib/model/utils/logger.py rename to faster_rcnn/lib/model/utils/logger.py diff --git a/lib/model/utils/net_utils.py b/faster_rcnn/lib/model/utils/net_utils.py similarity index 99% rename from lib/model/utils/net_utils.py rename to faster_rcnn/lib/model/utils/net_utils.py index fb9dc1f19..f06ae5150 100644 --- a/lib/model/utils/net_utils.py +++ b/faster_rcnn/lib/model/utils/net_utils.py @@ -4,7 +4,7 @@ from torch.autograd import Variable import numpy as np import torchvision.models as models -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg import cv2 import pdb import random diff --git a/lib/pycocotools/UPSTREAM_REV b/faster_rcnn/lib/pycocotools/UPSTREAM_REV similarity index 100% rename from lib/pycocotools/UPSTREAM_REV rename to faster_rcnn/lib/pycocotools/UPSTREAM_REV diff --git a/lib/pycocotools/__init__.py b/faster_rcnn/lib/pycocotools/__init__.py similarity index 100% rename from lib/pycocotools/__init__.py rename to faster_rcnn/lib/pycocotools/__init__.py diff --git a/lib/pycocotools/_mask.c b/faster_rcnn/lib/pycocotools/_mask.c similarity index 100% rename from lib/pycocotools/_mask.c rename to faster_rcnn/lib/pycocotools/_mask.c diff --git a/lib/pycocotools/_mask.pyx b/faster_rcnn/lib/pycocotools/_mask.pyx similarity index 100% rename from lib/pycocotools/_mask.pyx rename to faster_rcnn/lib/pycocotools/_mask.pyx diff --git a/lib/pycocotools/coco.py b/faster_rcnn/lib/pycocotools/coco.py similarity index 100% rename from lib/pycocotools/coco.py rename to faster_rcnn/lib/pycocotools/coco.py diff --git a/lib/pycocotools/cocoeval.py b/faster_rcnn/lib/pycocotools/cocoeval.py similarity index 100% rename from lib/pycocotools/cocoeval.py rename to faster_rcnn/lib/pycocotools/cocoeval.py diff --git a/lib/pycocotools/license.txt b/faster_rcnn/lib/pycocotools/license.txt similarity index 100% rename from lib/pycocotools/license.txt rename to faster_rcnn/lib/pycocotools/license.txt diff --git a/lib/pycocotools/mask.py b/faster_rcnn/lib/pycocotools/mask.py similarity index 100% rename from lib/pycocotools/mask.py rename to faster_rcnn/lib/pycocotools/mask.py diff --git a/lib/pycocotools/maskApi.c b/faster_rcnn/lib/pycocotools/maskApi.c similarity index 100% rename from lib/pycocotools/maskApi.c rename to faster_rcnn/lib/pycocotools/maskApi.c diff --git a/lib/pycocotools/maskApi.h b/faster_rcnn/lib/pycocotools/maskApi.h similarity index 100% rename from lib/pycocotools/maskApi.h rename to faster_rcnn/lib/pycocotools/maskApi.h diff --git a/lib/roi_data_layer/__init__.py b/faster_rcnn/lib/roi_data_layer/__init__.py similarity index 100% rename from lib/roi_data_layer/__init__.py rename to faster_rcnn/lib/roi_data_layer/__init__.py diff --git a/lib/roi_data_layer/minibatch.py b/faster_rcnn/lib/roi_data_layer/minibatch.py similarity index 94% rename from lib/roi_data_layer/minibatch.py rename to faster_rcnn/lib/roi_data_layer/minibatch.py index 4fb44328d..d80a9d3ed 100644 --- a/lib/roi_data_layer/minibatch.py +++ b/faster_rcnn/lib/roi_data_layer/minibatch.py @@ -12,9 +12,9 @@ import numpy as np import numpy.random as npr -from scipy.misc import imread -from model.utils.config import cfg -from model.utils.blob import prep_im_for_blob, im_list_to_blob +from imageio import imread +from faster_rcnn.lib.model.utils.config import cfg +from faster_rcnn.lib.model.utils.blob import prep_im_for_blob, im_list_to_blob import pdb def get_minibatch(roidb, num_classes): """Given a roidb, construct a minibatch sampled from it.""" @@ -33,13 +33,13 @@ def get_minibatch(roidb, num_classes): assert len(im_scales) == 1, "Single batch only" assert len(roidb) == 1, "Single batch only" - + # gt boxes: (x1, y1, x2, y2, cls) if cfg.TRAIN.USE_ALL_GT: # Include all ground truth boxes gt_inds = np.where(roidb[0]['gt_classes'] != 0)[0] else: - # For the COCO ground truth boxes, exclude the ones that are ''iscrowd'' + # For the COCO ground truth boxes, exclude the ones that are ''iscrowd'' gt_inds = np.where((roidb[0]['gt_classes'] != 0) & np.all(roidb[0]['gt_overlaps'].toarray() > -1.0, axis=1))[0] gt_boxes = np.empty((len(gt_inds), 5), dtype=np.float32) gt_boxes[:, 0:4] = roidb[0]['boxes'][gt_inds, :] * im_scales[0] diff --git a/lib/roi_data_layer/roibatchLoader.py b/faster_rcnn/lib/roi_data_layer/roibatchLoader.py similarity index 97% rename from lib/roi_data_layer/roibatchLoader.py rename to faster_rcnn/lib/roi_data_layer/roibatchLoader.py index 9b6e54ecf..016cc743f 100644 --- a/lib/roi_data_layer/roibatchLoader.py +++ b/faster_rcnn/lib/roi_data_layer/roibatchLoader.py @@ -10,9 +10,9 @@ from PIL import Image import torch -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg from roi_data_layer.minibatch import get_minibatch, get_minibatch -from model.rpn.bbox_transform import bbox_transform_inv, clip_boxes +from faster_rcnn.lib.model.rpn.bbox_transform import bbox_transform_inv, clip_boxes import numpy as np import random @@ -93,7 +93,7 @@ def __getitem__(self, index): max_y = int(torch.max(gt_boxes[:,3])) trim_size = int(np.floor(data_width / ratio)) if trim_size > data_height: - trim_size = data_height + trim_size = data_height box_region = max_y - min_y + 1 if min_y == 0: y_s = 0 @@ -129,7 +129,7 @@ def __getitem__(self, index): max_x = int(torch.max(gt_boxes[:,2])) trim_size = int(np.ceil(data_height * ratio)) if trim_size > data_width: - trim_size = data_width + trim_size = data_width box_region = max_x - min_x + 1 if min_x == 0: x_s = 0 diff --git a/lib/roi_data_layer/roidb.py b/faster_rcnn/lib/roi_data_layer/roidb.py similarity index 96% rename from lib/roi_data_layer/roidb.py rename to faster_rcnn/lib/roi_data_layer/roidb.py index df50e60c9..0570a193d 100644 --- a/lib/roi_data_layer/roidb.py +++ b/faster_rcnn/lib/roi_data_layer/roidb.py @@ -5,7 +5,7 @@ import datasets import numpy as np -from model.utils.config import cfg +from faster_rcnn.lib.model.utils.config import cfg from datasets.factory import get_imdb import PIL import pdb @@ -22,7 +22,7 @@ def prepare_roidb(imdb): if not (imdb.name.startswith('coco')): sizes = [PIL.Image.open(imdb.image_path_at(i)).size for i in range(imdb.num_images)] - + for i in range(len(imdb.image_index)): roidb[i]['img_id'] = imdb.image_id_at(i) roidb[i]['image'] = imdb.image_path_at(i) @@ -49,8 +49,8 @@ def prepare_roidb(imdb): def rank_roidb_ratio(roidb): # rank roidb based on the ratio between width and height. ratio_large = 2 # largest ratio to preserve. - ratio_small = 0.5 # smallest ratio to preserve. - + ratio_small = 0.5 # smallest ratio to preserve. + ratio_list = [] for i in range(len(roidb)): width = roidb[i]['width'] @@ -62,7 +62,7 @@ def rank_roidb_ratio(roidb): ratio = ratio_large elif ratio < ratio_small: roidb[i]['need_crop'] = 1 - ratio = ratio_small + ratio = ratio_small else: roidb[i]['need_crop'] = 0 @@ -104,7 +104,7 @@ def get_training_roidb(imdb): print('done') return imdb.roidb - + def get_roidb(imdb_name): imdb = get_imdb(imdb_name) print('Loaded dataset `{:s}` for training'.format(imdb.name)) diff --git a/faster_rcnn/scripts/__init__.py b/faster_rcnn/scripts/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/faster_rcnn/scripts/demo.py b/faster_rcnn/scripts/demo.py new file mode 100644 index 000000000..08009d7b8 --- /dev/null +++ b/faster_rcnn/scripts/demo.py @@ -0,0 +1,398 @@ +# -------------------------------------------------------- +# Tensorflow Faster R-CNN +# Licensed under The MIT License [see LICENSE for details] +# Written by Jiasen Lu, Jianwei Yang, based on code from Ross Girshick +# -------------------------------------------------------- +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function + +import faster_rcnn._init_paths +import os +import sys +import numpy as np +import argparse +import pprint +import pdb +import time +import cv2 +import torch +from torch.autograd import Variable +import torch.nn as nn +import torch.optim as optim + +import torchvision.transforms as transforms +import torchvision.datasets as dset +from imageio import imread +from roi_data_layer.roidb import combined_roidb +from roi_data_layer.roibatchLoader import roibatchLoader +from faster_rcnn.lib.model.utils.config import cfg, cfg_from_file, cfg_from_list, get_output_dir +from faster_rcnn.lib.model.rpn.bbox_transform import clip_boxes +# from faster_rcnn.lib.model.nms.nms_wrapper import nms +from faster_rcnn.lib.model.roi_layers import nms +from faster_rcnn.lib.model.rpn.bbox_transform import bbox_transform_inv +from faster_rcnn.lib.model.utils.net_utils import save_net, load_net, vis_detections +from faster_rcnn.lib.model.utils.blob import im_list_to_blob +from faster_rcnn.lib.model.faster_rcnn.vgg16 import vgg16 +from faster_rcnn.lib.model.faster_rcnn.resnet import resnet +import pdb + +try: + xrange # Python 2 +except NameError: + xrange = range # Python 3 + + +def parse_args(): + """ + Parse input arguments + """ + parser = argparse.ArgumentParser(description='Train a Fast R-CNN network') + parser.add_argument('--dataset', dest='dataset', + help='training dataset', + default='pascal_voc', type=str) + parser.add_argument('--cfg', dest='cfg_file', + help='optional config file', + default= + os.path.join(os.sep.join(faster_rcnn.__file__.split(os.sep)[:-1]), + 'cfgs', 'vgg16.yml'), type=str) + parser.add_argument('--net', dest='net', + help='vgg16, res50, res101, res152', + default='res101', type=str) + parser.add_argument('--set', dest='set_cfgs', + help='set config keys', default=None, + nargs=argparse.REMAINDER) + parser.add_argument('--load_dir', dest='load_dir', + help='directory to load models', + default="/srv/share/jyang375/models") + parser.add_argument('--image_dir', dest='image_dir', + help='directory to load images for demo', + default="images") + parser.add_argument('--cuda', dest='cuda', + help='whether use CUDA', + action='store_true') + parser.add_argument('--mGPUs', dest='mGPUs', + help='whether use multiple GPUs', + action='store_true') + parser.add_argument('--cag', dest='class_agnostic', + help='whether perform class_agnostic bbox regression', + action='store_true') + parser.add_argument('--parallel_type', dest='parallel_type', + help='which part of model to parallel, 0: all, 1: model before roi pooling', + default=0, type=int) + parser.add_argument('--checksession', dest='checksession', + help='checksession to load model', + default=1, type=int) + parser.add_argument('--checkepoch', dest='checkepoch', + help='checkepoch to load network', + default=1, type=int) + parser.add_argument('--checkpoint', dest='checkpoint', + help='checkpoint to load network', + default=10021, type=int) + parser.add_argument('--bs', dest='batch_size', + help='batch_size', + default=1, type=int) + parser.add_argument('--vis', dest='vis', + help='visualization mode', + action='store_true') + parser.add_argument('--webcam_num', dest='webcam_num', + help='webcam ID number', + default=-1, type=int) + + args = parser.parse_args() + return args + + +lr = cfg.TRAIN.LEARNING_RATE +momentum = cfg.TRAIN.MOMENTUM +weight_decay = cfg.TRAIN.WEIGHT_DECAY + + +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 = [] + 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) + + # Create a blob to hold the input images + blob = im_list_to_blob(processed_ims) + + return blob, np.array(im_scale_factors) + + +def 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.USE_GPU_NMS = args.cuda + + print('Using config:') + pprint.pprint(cfg) + np.random.seed(cfg.RNG_SEED) + + # train set + # -- Note: Use validation set and disable the flipped to enable faster loading. + + input_dir = args.load_dir + "/" + args.net + "/" + args.dataset + if not os.path.exists(input_dir): + raise Exception( + 'There is no input directory for loading network from ' + input_dir) + load_name = os.path.join(input_dir, + 'faster_rcnn_{}_{}_{}.pth'.format(args.checksession, args.checkepoch, args.checkpoint)) + + pascal_classes = np.asarray(['__background__', + 'aeroplane', 'bicycle', 'bird', 'boat', + 'bottle', 'bus', 'car', 'cat', 'chair', + 'cow', 'diningtable', 'dog', 'horse', + 'motorbike', 'person', 'pottedplant', + 'sheep', 'sofa', 'train', 'tvmonitor']) + + # initilize the network here. + if args.net == 'vgg16': + fasterRCNN = vgg16(pascal_classes, pretrained=False, + class_agnostic=args.class_agnostic) + elif args.net == 'res101': + fasterRCNN = resnet(pascal_classes, 101, pretrained=False, + class_agnostic=args.class_agnostic) + elif args.net == 'res50': + fasterRCNN = resnet(pascal_classes, 50, pretrained=False, + class_agnostic=args.class_agnostic) + elif args.net == 'res152': + fasterRCNN = resnet(pascal_classes, 152, pretrained=False, + class_agnostic=args.class_agnostic) + else: + print("network is not defined") + pdb.set_trace() + + fasterRCNN.create_architecture() + + print("load checkpoint %s" % (load_name)) + if args.cuda > 0: + checkpoint = torch.load(load_name) + else: + checkpoint = torch.load( + load_name, map_location=(lambda storage, loc: storage)) + fasterRCNN.load_state_dict(checkpoint['model']) + if 'pooling_mode' in checkpoint.keys(): + cfg.POOLING_MODE = checkpoint['pooling_mode'] + + print('load model successfully!') + + # pdb.set_trace() + + print("load checkpoint %s" % (load_name)) + + # initilize the tensor holder here. + im_data = torch.FloatTensor(1) + im_info = torch.FloatTensor(1) + num_boxes = torch.LongTensor(1) + gt_boxes = torch.FloatTensor(1) + + # ship to cuda + if args.cuda > 0: + im_data = im_data.cuda() + im_info = im_info.cuda() + num_boxes = num_boxes.cuda() + gt_boxes = gt_boxes.cuda() + + # make variable + im_data = Variable(im_data, volatile=True) + im_info = Variable(im_info, volatile=True) + num_boxes = Variable(num_boxes, volatile=True) + gt_boxes = Variable(gt_boxes, volatile=True) + + if args.cuda > 0: + cfg.CUDA = True + + if args.cuda > 0: + fasterRCNN.cuda() + + fasterRCNN.eval() + + start = time.time() + max_per_image = 100 + thresh = 0.05 + vis = True + + webcam_num = args.webcam_num + # Set up webcam or get image directories + if webcam_num >= 0: + cap = cv2.VideoCapture(webcam_num) + num_images = 0 + else: + imglist = os.listdir(args.image_dir) + num_images = len(imglist) + + print('Loaded Photo: {} images.'.format(num_images)) + + while (num_images >= 0): + total_tic = time.time() + if webcam_num == -1: + num_images -= 1 + + # Get image from the webcam + if webcam_num >= 0: + if not cap.isOpened(): + raise RuntimeError( + "Webcam could not open. Please check connection.") + ret, frame = cap.read() + im_in = np.array(frame) + # Load the demo image + else: + im_file = os.path.join(args.image_dir, imglist[num_images]) + # im = cv2.imread(im_file) + im_in = np.array(imread(im_file)) + if len(im_in.shape) == 2: + im_in = im_in[:, :, np.newaxis] + im_in = np.concatenate((im_in, im_in, im_in), axis=2) + # rgb -> bgr + im = im_in[:, :, ::-1] + + blobs, im_scales = _get_image_blob(im) + assert len(im_scales) == 1, "Only single-image batch implemented" + im_blob = blobs + im_info_np = np.array( + [[im_blob.shape[1], im_blob.shape[2], im_scales[0]]], dtype=np.float32) + + im_data_pt = torch.from_numpy(im_blob) + im_data_pt = im_data_pt.permute(0, 3, 1, 2) + im_info_pt = torch.from_numpy(im_info_np) + + with torch.no_grad(): + im_data.resize_(im_data_pt.size()).copy_(im_data_pt) + im_info.resize_(im_info_pt.size()).copy_(im_info_pt) + gt_boxes.resize_(1, 1, 5).zero_() + num_boxes.resize_(1).zero_() + + # pdb.set_trace() + det_tic = time.time() + + rois, cls_prob, bbox_pred, \ + rpn_loss_cls, rpn_loss_box, \ + RCNN_loss_cls, RCNN_loss_bbox, \ + rois_label = fasterRCNN(im_data, im_info, gt_boxes, num_boxes) + + scores = cls_prob.data + boxes = rois.data[:, :, 1:5] + + if cfg.TEST.BBOX_REG: + # Apply bounding-box regression deltas + box_deltas = bbox_pred.data + if cfg.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED: + # Optionally normalize targets by a precomputed mean and stdev + if args.class_agnostic: + if args.cuda > 0: + box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS).cuda() \ + + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS).cuda() + else: + box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS) \ + + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS) + + box_deltas = box_deltas.view(1, -1, 4) + else: + if args.cuda > 0: + box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS).cuda() \ + + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS).cuda() + else: + box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS) \ + + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS) + box_deltas = box_deltas.view( + 1, -1, 4 * len(pascal_classes)) + + pred_boxes = bbox_transform_inv(boxes, box_deltas, 1) + pred_boxes = clip_boxes(pred_boxes, im_info.data, 1) + else: + # Simply repeat the boxes, once for each class + pred_boxes = np.tile(boxes, (1, scores.shape[1])) + + pred_boxes /= im_scales[0] + + scores = scores.squeeze() + pred_boxes = pred_boxes.squeeze() + det_toc = time.time() + detect_time = det_toc - det_tic + misc_tic = time.time() + if vis: + im2show = np.copy(im) + for j in xrange(1, len(pascal_classes)): + inds = torch.nonzero(scores[:, j] > thresh).view(-1) + # if there is det + if inds.numel() > 0: + cls_scores = scores[:, j][inds] + _, order = torch.sort(cls_scores, 0, True) + if args.class_agnostic: + cls_boxes = pred_boxes[inds, :] + else: + cls_boxes = pred_boxes[inds][:, j * 4:(j + 1) * 4] + + cls_dets = torch.cat((cls_boxes, cls_scores.unsqueeze(1)), 1) + # cls_dets = torch.cat((cls_boxes, cls_scores), 1) + cls_dets = cls_dets[order] + # keep = nms(cls_dets, cfg.TEST.NMS, force_cpu=not cfg.USE_GPU_NMS) + keep = nms(cls_boxes[order, :], + cls_scores[order], cfg.TEST.NMS) + cls_dets = cls_dets[keep.view(-1).long()] + if vis: + im2show = vis_detections( + im2show, pascal_classes[j], cls_dets.cpu().numpy(), 0.5) + + misc_toc = time.time() + nms_time = misc_toc - misc_tic + + if webcam_num == -1: + sys.stdout.write('im_detect: {:d}/{:d} {:.3f}s {:.3f}s \r' + .format(num_images + 1, len(imglist), detect_time, nms_time)) + sys.stdout.flush() + + if vis and webcam_num == -1: + # cv2.imshow('test', im2show) + # cv2.waitKey(0) + result_path = os.path.join( + args.image_dir, imglist[num_images][:-4] + "_det.jpg") + cv2.imwrite(result_path, im2show) + else: + im2showRGB = cv2.cvtColor(im2show, cv2.COLOR_BGR2RGB) + cv2.imshow("frame", im2showRGB) + total_toc = time.time() + total_time = total_toc - total_tic + frame_rate = 1 / total_time + print('Frame rate:', frame_rate) + if cv2.waitKey(1) & 0xFF == ord('q'): + break + if webcam_num >= 0: + cap.release() + cv2.destroyAllWindows() + + +if __name__ == '__main__': + main() diff --git a/test_net.py b/faster_rcnn/scripts/test_net.py similarity index 92% rename from test_net.py rename to faster_rcnn/scripts/test_net.py index 7e8522a2a..abc5f3b6c 100644 --- a/test_net.py +++ b/faster_rcnn/scripts/test_net.py @@ -7,7 +7,7 @@ from __future__ import division from __future__ import print_function -import _init_paths +import faster_rcnn._init_paths import os import sys import numpy as np @@ -25,14 +25,14 @@ import pickle from roi_data_layer.roidb import combined_roidb from roi_data_layer.roibatchLoader import roibatchLoader -from model.utils.config import cfg, cfg_from_file, cfg_from_list, get_output_dir -from model.rpn.bbox_transform import clip_boxes -# from model.nms.nms_wrapper import nms -from model.roi_layers import nms -from model.rpn.bbox_transform import bbox_transform_inv -from model.utils.net_utils import save_net, load_net, vis_detections -from model.faster_rcnn.vgg16 import vgg16 -from model.faster_rcnn.resnet import resnet +from faster_rcnn.lib.model.utils.config import cfg, cfg_from_file, cfg_from_list, get_output_dir +from faster_rcnn.lib.model.rpn.bbox_transform import clip_boxes +# from faster_rcnn.lib.model.nms.nms_wrapper import nms +from faster_rcnn.lib.model.roi_layers import nms +from faster_rcnn.lib.model.rpn.bbox_transform import bbox_transform_inv +from faster_rcnn.lib.model.utils.net_utils import save_net, load_net, vis_detections +from faster_rcnn.lib.model.faster_rcnn.vgg16 import vgg16 +from faster_rcnn.lib.model.faster_rcnn.resnet import resnet try: xrange # Python 2 @@ -50,7 +50,8 @@ def parse_args(): default='pascal_voc', type=str) parser.add_argument('--cfg', dest='cfg_file', help='optional config file', - default='cfgs/vgg16.yml', type=str) + default=os.path.join(os.sep.join(faster_rcnn.__file__.split(os.sep)[:-1]), + 'cfgs', 'vgg16.yml'), type=str) parser.add_argument('--net', dest='net', help='vgg16, res50, res101, res152', default='res101', type=str) @@ -94,8 +95,7 @@ def parse_args(): momentum = cfg.TRAIN.MOMENTUM weight_decay = cfg.TRAIN.WEIGHT_DECAY -if __name__ == '__main__': - +def main(): args = parse_args() print('Called with args:') @@ -126,7 +126,10 @@ def parse_args(): args.imdbval_name = "vg_150-50-50_minival" args.set_cfgs = ['ANCHOR_SCALES', '[4, 8, 16, 32]', 'ANCHOR_RATIOS', '[0.5,1,2]'] - args.cfg_file = "cfgs/{}_ls.yml".format(args.net) if args.large_scale else "cfgs/{}.yml".format(args.net) + args.cfg_file = os.path.join(os.sep.join(faster_rcnn.__file__.split(os.sep)[:-1]), + 'cfgs', + ("{}_ls.yml".format(args.net) if + args.large_scale else "{}.yml".format(args.net))) if args.cfg_file is not None: cfg_from_file(args.cfg_file) @@ -283,7 +286,7 @@ def parse_args(): cls_boxes = pred_boxes[inds, :] else: cls_boxes = pred_boxes[inds][:, j * 4:(j + 1) * 4] - + cls_dets = torch.cat((cls_boxes, cls_scores.unsqueeze(1)), 1) # cls_dets = torch.cat((cls_boxes, cls_scores), 1) cls_dets = cls_dets[order] @@ -326,3 +329,5 @@ def parse_args(): end = time.time() print("test time: %0.4fs" % (end - start)) +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/trainval_net.py b/faster_rcnn/scripts/trainval_net.py similarity index 97% rename from trainval_net.py rename to faster_rcnn/scripts/trainval_net.py index 4bc817307..e0dfe3f73 100644 --- a/trainval_net.py +++ b/faster_rcnn/scripts/trainval_net.py @@ -7,7 +7,7 @@ from __future__ import division from __future__ import print_function -import _init_paths +import faster_rcnn._init_paths import os import sys import numpy as np @@ -26,12 +26,12 @@ from roi_data_layer.roidb import combined_roidb from roi_data_layer.roibatchLoader import roibatchLoader -from model.utils.config import cfg, cfg_from_file, cfg_from_list, get_output_dir -from model.utils.net_utils import weights_normal_init, save_net, load_net, \ +from faster_rcnn.lib.model.utils.config import cfg, cfg_from_file, cfg_from_list, get_output_dir +from faster_rcnn.lib.model.utils.net_utils import weights_normal_init, save_net, load_net, \ adjust_learning_rate, save_checkpoint, clip_gradient -from model.faster_rcnn.vgg16 import vgg16 -from model.faster_rcnn.resnet import resnet +from faster_rcnn.lib.model.faster_rcnn.vgg16 import vgg16 +from faster_rcnn.lib.model.faster_rcnn.resnet import resnet def parse_args(): """ @@ -68,7 +68,7 @@ def parse_args(): action='store_true') parser.add_argument('--ls', dest='large_scale', help='whether use large imag scale', - action='store_true') + action='store_true') parser.add_argument('--mGPUs', dest='mGPUs', help='whether use multiple GPUs', action='store_true') @@ -145,8 +145,8 @@ def __iter__(self): def __len__(self): return self.num_data -if __name__ == '__main__': +def main(): args = parse_args() print('Called with args:') @@ -264,7 +264,7 @@ def __len__(self): if args.cuda: fasterRCNN.cuda() - + if args.optimizer == "adam": lr = lr * 0.1 optimizer = torch.optim.Adam(params) @@ -369,7 +369,7 @@ def __len__(self): loss_temp = 0 start = time.time() - + save_name = os.path.join(output_dir, 'faster_rcnn_{}_{}_{}.pth'.format(args.session, epoch, step)) save_checkpoint({ 'session': args.session, @@ -383,3 +383,6 @@ def __len__(self): if args.use_tfboard: logger.close() + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/lib/model/nms/src/nms_cuda.c b/lib/model/nms/src/nms_cuda.c deleted file mode 100644 index 3667c7d2f..000000000 --- a/lib/model/nms/src/nms_cuda.c +++ /dev/null @@ -1,19 +0,0 @@ -#include -#include -#include "nms_cuda_kernel.h" - -// this symbol will be resolved automatically from PyTorch libs -extern THCState *state; - -int nms_cuda(THCudaIntTensor *keep_out, THCudaTensor *boxes_host, - THCudaIntTensor *num_out, float nms_overlap_thresh) { - - nms_cuda_compute(THCudaIntTensor_data(state, keep_out), - THCudaIntTensor_data(state, num_out), - THCudaTensor_data(state, boxes_host), - THCudaTensor_size(state, boxes_host, 0), - THCudaTensor_size(state, boxes_host, 1), - nms_overlap_thresh); - - return 1; -} diff --git a/lib/model/roi_crop/_ext/crop_resize/_crop_resize.so b/lib/model/roi_crop/_ext/crop_resize/_crop_resize.so deleted file mode 100755 index 9baf6615c..000000000 Binary files a/lib/model/roi_crop/_ext/crop_resize/_crop_resize.so and /dev/null differ diff --git a/lib/setup.py b/setup.py similarity index 62% rename from lib/setup.py rename to setup.py index 7e7e20018..043b38406 100644 --- a/lib/setup.py +++ b/setup.py @@ -11,11 +11,11 @@ from torch.utils.cpp_extension import CppExtension from torch.utils.cpp_extension import CUDAExtension -requirements = ["torch", "torchvision"] - +with open('requirements.txt') as inp: + requirements = inp.read().splitlines() def get_extensions(): - this_dir = os.path.dirname(os.path.abspath(__file__)) + this_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'faster_rcnn', 'lib') extensions_dir = os.path.join(this_dir, "model", "csrc") main_file = glob.glob(os.path.join(extensions_dir, "*.cpp")) @@ -45,7 +45,7 @@ def get_extensions(): ext_modules = [ extension( - "model._C", + "faster_rcnn.lib.model._C", sources, include_dirs=include_dirs, define_macros=define_macros, @@ -56,12 +56,30 @@ def get_extensions(): return ext_modules +def get_scripts_dict(): + """Construct the scripts dictionary, ie the dictionary of the executables + """ + scripts_dict = {} + for root, _, files in os.walk(os.path.join('faster_rcnn', 'scripts')): + for fil in files: + if fil.endswith('.py') and fil != '__init__.py': + path = os.path.join(root, fil) + module = 'faster_rcnn' + '.'.join(path.split( + 'faster_rcnn')[-1][:-3].split(os.sep)) + ":main" + scripts_dict[fil[:-3]] = module + return scripts_dict + + setup( name="faster_rcnn", - version="0.1", + version="0.2", description="object detection in pytorch", - packages=find_packages(exclude=("configs", "tests",)), - # install_requires=requirements, + install_requires=requirements, + packages=find_packages(), ext_modules=get_extensions(), cmdclass={"build_ext": torch.utils.cpp_extension.BuildExtension}, + entry_points={ + 'console_scripts': [ + "faster_rcnn_" + script + + '=' + d[script] for d in [get_scripts_dict()] for script in d]} )