def run_faster_rcnn(): print("Running training") base_folder = os.path.dirname(os.path.abspath(__file__)) sys.path.append(os.path.join(base_folder, "FasterRCNN")) from cntk import load_model from FasterRCNN_train import prepare from FasterRCNN_eval import compute_test_set_aps from FasterRCNN.FasterRCNN_eval import FasterRCNN_Evaluator import numpy as np import json cfg = get_configuration() prepare(cfg, False) cfg["DATA"].NUM_TEST_IMAGES = args.num_test cfg["CNTK"].MAKE_MODE = True cfg["CNTK"].VISUALIZE_RESULTS = True if args.gpu: cfg["CNTK"].USE_GPU_NMS = True else: cfg["CNTK"].USE_GPU_NMS = False if not (args.conf_threshold is None): cfg.RESULTS_NMS_CONF_THRESHOLD = args.conf_threshold trained_model = load_model(args.model_path) eval_results = compute_test_set_aps(trained_model, cfg) for class_name in eval_results: print('Average precision (AP) for {:>15} = {:.4f}'.format( class_name, eval_results[class_name])) print('Mean average precision (AP) = {:.4f}'.format( np.nanmean(list(eval_results.values())))) if cfg["CNTK"].VISUALIZE_RESULTS: num_eval = min(cfg["DATA"].NUM_TEST_IMAGES, 100) results_folder = os.path.join(cfg.OUTPUT_PATH, cfg["DATA"].DATASET) evaluator = FasterRCNN_Evaluator(trained_model, cfg) plot_test_set_results(evaluator, num_eval, results_folder, cfg) with open( r"/cntk/Examples/Image/Detection/FasterRCNN/Output/custom_images_output.json", "w+") as resultFile: print( "Bounding boxes written to /cntk/Examples/Image/Detection/FasterRCNN/Output/custom_images_output.json" ) resultFile.write(json.dumps(json_output))
def run_fasterrcnn_grocery_training(e2e): from FasterRCNN_eval import compute_test_set_aps from utils.config_helpers import merge_configs from FasterRCNN_config import cfg as detector_cfg from utils.configs.AlexNet_config import cfg as network_cfg from utils.configs.Grocery_config import cfg as dataset_cfg cfg = merge_configs([detector_cfg, network_cfg, dataset_cfg]) cfg["CNTK"].FORCE_DETERMINISTIC = True cfg["CNTK"].DEBUG_OUTPUT = False cfg["CNTK"].MAKE_MODE = False cfg["CNTK"].FAST_MODE = False cfg.CNTK.E2E_MAX_EPOCHS = 3 cfg.CNTK.RPN_EPOCHS = 2 cfg.CNTK.FRCN_EPOCHS = 2 cfg.IMAGE_WIDTH = 400 cfg.IMAGE_HEIGHT = 400 cfg["CNTK"].TRAIN_E2E = e2e cfg.USE_GPU_NMS = False cfg.VISUALIZE_RESULTS = False cfg["DATA"].MAP_FILE_PATH = grocery_path externalData = 'CNTK_EXTERNAL_TESTDATA_SOURCE_DIRECTORY' in os.environ if externalData: extPath = os.environ['CNTK_EXTERNAL_TESTDATA_SOURCE_DIRECTORY'] model_file = os.path.join(extPath, "PreTrainedModels", "AlexNet", "v1", "AlexNet_ImageNet_Caffe.model") else: model_file = os.path.join( abs_path, *"../../../../PretrainedModels/AlexNet_ImageNet_Caffe.model".split( "/")) from FasterRCNN_train import prepare, train_faster_rcnn np.random.seed(seed=3) prepare(cfg, False) cfg['BASE_MODEL_PATH'] = model_file trained_model = train_faster_rcnn(cfg) eval_results = compute_test_set_aps(trained_model, cfg) meanAP = np.nanmean(list(eval_results.values())) print('meanAP={}'.format(meanAP)) assert meanAP > 0.01 return trained_model, meanAP, cfg
def run_fasterrcnn_grocery_training(e2e): from FasterRCNN_eval import compute_test_set_aps from utils.config_helpers import merge_configs from FasterRCNN_config import cfg as detector_cfg from utils.configs.AlexNet_config import cfg as network_cfg from utils.configs.Grocery_config import cfg as dataset_cfg cfg = merge_configs([detector_cfg, network_cfg, dataset_cfg]) cfg["CNTK"].FORCE_DETERMINISTIC = True cfg["CNTK"].DEBUG_OUTPUT = False cfg["CNTK"].MAKE_MODE = False cfg["CNTK"].FAST_MODE = False cfg.CNTK.E2E_MAX_EPOCHS = 3 cfg.CNTK.RPN_EPOCHS = 2 cfg.CNTK.FRCN_EPOCHS = 2 cfg.IMAGE_WIDTH = 400 cfg.IMAGE_HEIGHT = 400 cfg["CNTK"].TRAIN_E2E = e2e cfg.USE_GPU_NMS = False cfg.VISUALIZE_RESULTS = False cfg["DATA"].MAP_FILE_PATH = grocery_path externalData = 'CNTK_EXTERNAL_TESTDATA_SOURCE_DIRECTORY' in os.environ if externalData: extPath = os.environ['CNTK_EXTERNAL_TESTDATA_SOURCE_DIRECTORY'] model_file = os.path.join(extPath, "PreTrainedModels", "AlexNet", "v1", "AlexNet_ImageNet_Caffe.model") else: model_file = os.path.join(abs_path, *"../../../../PretrainedModels/AlexNet_ImageNet_Caffe.model".split("/")) from FasterRCNN_train import prepare, train_faster_rcnn np.random.seed(seed=3) prepare(cfg, False) cfg['BASE_MODEL_PATH'] = model_file trained_model = train_faster_rcnn(cfg) eval_results = compute_test_set_aps(trained_model, cfg) meanAP = np.nanmean(list(eval_results.values())) print('meanAP={}'.format(meanAP)) assert meanAP > 0.01 return trained_model, meanAP, cfg
def reenable_once_sorting_is_stable_test_native_fasterrcnn_eval(device_id): if cntk_device(device_id).type() != DeviceKind_GPU: pytest.skip('test only runs on GPU') # it runs very slow in CPU try_set_default_device(cntk_device(device_id)) from FasterRCNN_eval import compute_test_set_aps eval_model, meanAP_python, cfg = run_fasterrcnn_grocery_training(True) cntk_py.always_allow_setting_default_device() try_set_default_device(cpu()) sys.path.append(os.path.join(abs_path, "..", "..", "..", "..", "Examples", "Extensibility", "ProposalLayer")) from native_proposal_layer import clone_with_native_proposal_layer model_with_native_pl = clone_with_native_proposal_layer(eval_model) eval_results = compute_test_set_aps(model_with_native_pl, cfg) meanAP_native = np.nanmean(list(eval_results.values())) # 0.2067 (python) vs 0.2251 (native) -- the difference stems # from different sorting algorithms: quicksort in python and # heapsort in c++ (both are not stable). print("Python: {}, native: {}".format(meanAP_python, meanAP_native)) assert abs(meanAP_python - meanAP_native) < 0.1
def reenable_once_sorting_is_stable_test_native_fasterrcnn_eval(device_id): if cntk_device(device_id).type() != DeviceKind_GPU: pytest.skip('test only runs on GPU') # it runs very slow in CPU try_set_default_device(cntk_device(device_id)) from FasterRCNN_eval import compute_test_set_aps eval_model, meanAP_python, cfg = run_fasterrcnn_grocery_training(True) cntk_py.always_allow_setting_default_device() try_set_default_device(cpu()) sys.path.append( os.path.join(abs_path, "..", "..", "..", "..", "Examples", "Extensibility", "ProposalLayer")) from native_proposal_layer import clone_with_native_proposal_layer model_with_native_pl = clone_with_native_proposal_layer(eval_model) eval_results = compute_test_set_aps(model_with_native_pl, cfg) meanAP_native = np.nanmean(list(eval_results.values())) # 0.2067 (python) vs 0.2251 (native) -- the difference stems # from different sorting algorithms: quicksort in python and # heapsort in c++ (both are not stable). print("Python: {}, native: {}".format(meanAP_python, meanAP_native)) assert abs(meanAP_python - meanAP_native) < 0.1
from utils.configs.AlexNet_config import cfg as network_cfg # for Pascal VOC 2007 data set use: from utils.configs.Pascal_config import cfg as dataset_cfg # for the Grocery data set use: from utils.configs.Grocery_config import cfg as dataset_cfg from utils.configs.TNC_config import cfg as dataset_cfg return merge_configs([detector_cfg, network_cfg, dataset_cfg]) # trains and evaluates a Fast R-CNN model. if __name__ == '__main__': cfg = get_configuration() prepare(cfg, False) cntk.device.try_set_default_device(cntk.device.gpu(cfg.GPU_ID)) # train and test trained_model = train_faster_rcnn(cfg) eval_results = compute_test_set_aps(trained_model, cfg) # write AP results to output for class_name in eval_results: print('AP for {:>15} = {:.4f}'.format(class_name, eval_results[class_name])) print('Mean AP = {:.4f}'.format(np.nanmean(list(eval_results.values())))) # Plot results on test set images if cfg.VISUALIZE_RESULTS: num_eval = min(cfg["DATA"].NUM_TEST_IMAGES, 100) results_folder = os.path.join(cfg.OUTPUT_PATH, cfg["DATA"].DATASET) evaluator = FasterRCNN_Evaluator(trained_model, cfg) plot_test_set_results(evaluator, num_eval, results_folder, cfg) if cfg.STORE_EVAL_MODEL_WITH_NATIVE_UDF: store_eval_model_with_native_udf(trained_model, cfg)
from utils.configs.AlexNet_config import cfg as network_cfg # for Pascal VOC 2007 data set use: from utils.configs.Pascal_config import cfg as dataset_cfg # for the Grocery data set use: from utils.configs.Grocery_config import cfg as dataset_cfg from utils.configs.Grocery_config import cfg as dataset_cfg return merge_configs([detector_cfg, network_cfg, dataset_cfg]) # trains and evaluates a Fast R-CNN model. if __name__ == '__main__': cfg = get_configuration() prepare(cfg, False) # cntk.device.try_set_default_device(cntk.device.gpu(cfg.GPU_ID)) # train and test trained_model = train_faster_rcnn(cfg) eval_results = compute_test_set_aps(trained_model, cfg) # write AP results to output for class_name in eval_results: print('AP for {:>15} = {:.4f}'.format(class_name, eval_results[class_name])) print('Mean AP = {:.4f}'.format(np.nanmean(list(eval_results.values())))) # Plot results on test set images if cfg.VISUALIZE_RESULTS: num_eval = min(cfg["DATA"].NUM_TEST_IMAGES, 100) results_folder = os.path.join(cfg.OUTPUT_PATH, cfg["DATA"].DATASET) evaluator = FasterRCNN_Evaluator(trained_model, cfg) plot_test_set_results(evaluator, num_eval, results_folder, cfg) if cfg.STORE_EVAL_MODEL_WITH_NATIVE_UDF: store_eval_model_with_native_udf(trained_model, cfg)