Beispiel #1
0
    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))
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
    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)
Beispiel #7
0
    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)