def main():
    # Parse command line args
    if len(sys.argv) < 2:
        print 'USAGE: train.py project_file.json [output_dir]'
        sys.exit(1)
    project_file = sys.argv[1]
    if len(sys.argv) >= 3:
        output_dir = sys.argv[2]
    else:
        output_dir = '.'
    # Load project
    project = Project(project_file)
    # Generate training data
    training_dataset = project.get_training_dataset()
    training_genconfig = project.get_training_genconfig()
    input_data = training_dataset.generate_input_data(training_genconfig)
    output_data = training_dataset.generate_ground_truth_data(training_genconfig)
    print str(input_data.shape[0]) + " training samples were generated."
    print "Each sample contains " + str(input_data.shape[1]) + " pixels."
    # Create output directory if necessary
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    # Train each model
    for i in range(project.get_models_count()):
        model = project.get_model(i)
        model_name = project.get_model_name(i)
        print 'Training model ' + model_name + '...'
        model_path = os.path.join(output_dir, model_name + '.model')
        model.train(input_data, output_data, open(model_path, 'wb+'))
def main():
    # Parse command line args
    if len(sys.argv) < 2:
        print 'USAGE: validate.py project_file.json [models_dir]'
        sys.exit(1)
    project_file = sys.argv[1]
    if len(sys.argv) >= 3:
        models_dir = sys.argv[2]
    else:
        models_dir = '.'
    # Check that the models directory exists
    if not os.path.exists(models_dir):
        raise IOError('The models directory does not exist.')
    # Load project
    project = Project(project_file)
    # Generate validation data
    validation_dataset = project.get_validation_dataset()
    validation_genconfig = project.get_validation_genconfig()
    input_data = validation_dataset.generate_input_data(validation_genconfig)
    output_data = validation_dataset.generate_ground_truth_data(validation_genconfig)
    print str(input_data.shape[0]) + ' validation samples were generated.'
    print 'Each sample contains ' + str(input_data.shape[1]) + ' pixels.'
    # Validate each model
    for i in range(project.get_models_count()):
    #TODO : implement a validation method that doesn't need training to be finished, so that validation error could be visualized while the app is still running
        model = project.get_model(i)
        model_name = project.get_model_name(i)
        print 'Validating model ' + model_name + '...'
        model_filename = os.path.join(models_dir, model_name + '.model')
        validate(model, model_filename, model_name, input_data, output_data)
    # Show all plots
    plt.show()