예제 #1
0
def run_ctc():

    # Ruta del archivo de configuración, pasada por argumentos o por defecto "./config.json".
    if len(sys.argv) == 1:
        print(
            "Execution without arguments, config file by default: ./config.json"
        )
        config_file = str('./config.json')

    elif len(sys.argv) == 2:
        print("Execution with arguments, config file:" + str(sys.argv[1]))
        config_file = str(sys.argv[1])

    else:
        print()
        print("ERROR")
        print("Wrong number of arguments. Execute:")
        print(">> python3 train.py [path_config_file]")
        exit(1)

    # Cargamos del archivo de configuración
    try:
        config = json.load(open(config_file))
    except FileNotFoundError:
        print()
        print("ERROR")
        print("No such config file : " + config_file)
        exit(1)

    # Si el directorio destino no existe, se crea.
    if not os.path.exists(str(config["IAM-test"]["results_path"])):
        os.mkdir(str(config["IAM-test"]["results_path"]))
    if not os.path.exists(str(config["IAM-test"]["checkpoints_path"])):
        os.mkdir(str(config["IAM-test"]["checkpoints_path"]))

    # Extraemos las variables generales para el entrenamiento.
    im_path = str(config["general"]["processed_data_path"])
    csv_path = str(config["IAM-test"]["csv_path"])
    results_path = str(config["IAM-test"]["results_path"])
    checkpoints_path = str(config["IAM-test"]["checkpoints_path"])
    batch_size = int(config["IAM-test"]["batch_size"])
    num_epochs = int(config["IAM-test"]["num_epochs"])
    val_period = int(config["IAM-test"]["validation_period"])
    print_period = int(config["IAM-test"]["print_period"])
    height = int(config["general"]["height"])
    width = int(config["general"]["width"])
    dct = ast.literal_eval(str(config["general"]["dictionary"]))

    # Extraemos los parametros del modelo a validar
    kernel_size = int(config["cnn-rnn-ctc"]["kernel_size"])
    num_conv1 = int(config["cnn-rnn-ctc"]["num_conv1"])
    num_conv2 = int(config["cnn-rnn-ctc"]["num_conv2"])
    num_conv3 = int(config["cnn-rnn-ctc"]["num_conv3"])
    num_conv4 = int(config["cnn-rnn-ctc"]["num_conv4"])
    num_conv5 = int(config["cnn-rnn-ctc"]["num_conv5"])
    num_rnn = int(config["cnn-rnn-ctc"]["num_rnn"])
    num_fc = int(config["cnn-rnn-ctc"]["num_fc"])
    num_classes = int(config["cnn-rnn-ctc"]["num_classes"])
    ctc_input_len = int(config["cnn-rnn-ctc"]["ctc_input_len"])

    # Creamos el modelo ANN
    model = ANN_model.CNN_RNN_CTC(kernel_size, num_conv1, num_conv2, num_conv3,
                                  num_conv4, num_conv5, num_rnn, num_fc,
                                  height, width, num_classes)
    graph = model[0]
    inputs = model[1]
    targets = model[2]
    keep_prob = model[3]
    seq_len = model[4]
    optimizer = model[5]
    cost = model[6]
    ler = model[7]
    decoded = model[8]

    # Declaramos el DataFrames para almacenar el resultado del entrenamiento y la validación.
    train_result = pd.DataFrame()
    val_result1 = pd.DataFrame()
    val_result2 = pd.DataFrame()

    # Creamos la sesión con el modelo previamente cargado.
    with tf.Session(graph=graph) as session:
        # Guardamos la arquitectura del modelo e inicializamos sus vaiables
        saver = tf.train.Saver()
        tf.global_variables_initializer().run()

        # Inicializamos el LER a 1.
        LER = 1.0

        # Bucle de épocas.
        for curr_epoch in range(num_epochs):

            # Extraemos un lote aleatorio del Dataset de entrenamiento.
            train_inputs, train_targets, original, train_seq_len = hw_utils.extract_training_batch(
                ctc_input_len, batch_size, im_path, csv_path + "train.csv")
            feed = {
                inputs: train_inputs,
                targets: train_targets,
                keep_prob: 0.5,
                seq_len: train_seq_len
            }

            # Ejecutamos "optimizer", minimizando el error para el lote extraido.
            _ = session.run([optimizer], feed)

            # Comprobamos el periodo de validación para el modelo.
            if curr_epoch % val_period == 0:
                # Calculamos el error de la CTC y el LER para el dataset de entrenamiento y almacenamos a los resultados.
                train_cost, train_ler = session.run([cost, ler], feed)
                train_tuple = {
                    'epoch': [curr_epoch],
                    'train_cost': [train_cost],
                    'train_ler': [train_ler]
                }
                train_result = pd.concat(
                    [train_result, pd.DataFrame(train_tuple)])

                # Realizamos la validación del modelo para los dos Datasets de validación y almacenamos los resultados
                val_tuple1 = hw_utils.validation(curr_epoch, ctc_input_len,
                                                 batch_size, im_path,
                                                 csv_path + "validation1.csv",
                                                 inputs, targets, keep_prob,
                                                 seq_len, session, cost, ler)
                val_result1 = pd.concat(
                    [val_result1, pd.DataFrame(val_tuple1)])

                val_tuple2 = hw_utils.validation(curr_epoch, ctc_input_len,
                                                 batch_size, im_path,
                                                 csv_path + "validation2.csv",
                                                 inputs, targets, keep_prob,
                                                 seq_len, session, cost, ler)
                val_result2 = pd.concat(
                    [val_result2, pd.DataFrame(val_tuple2)])

                # Comprobamos si se ha obtenido un LER menor al mínimo obtenido hasta el momento.
                if (float(val_tuple1['val_ler'][0]) +
                        float(val_tuple2['val_ler'][0])) / 2 <= LER:
                    # Almacenamos el valor de las variables.
                    save_path = saver.save(
                        session, checkpoints_path + "checkpoint_epoch_" +
                        str(curr_epoch) + "_ler_" + str(
                            (float(val_tuple1['val_ler'][0]) +
                             float(val_tuple2['val_ler'][0])) / 2) + ".ckpt")
                    print("Model saved in file: " + str(save_path))

                    # Actualizamos el valor mínimo de LER.
                    LER = (float(val_tuple1['val_ler'][0]) +
                           float(val_tuple2['val_ler'][0])) / 2

                # Comprobamos el periodo de impresión de ejemplos.
                if curr_epoch % print_period == 0:

                    # Imprimimos el error cometido para el Dataset de validación en la época actual.
                    print("Epoch: " + str(curr_epoch) + " val_cost: " +
                          str((float(val_tuple1['val_cost'][0]) +
                               float(val_tuple2['val_cost'][0])) / 2) +
                          " val_ler: " +
                          str((float(val_tuple1['val_ler'][0]) +
                               float(val_tuple2['val_ler'][0])) / 2))

                    # Imprimimos la salida del modelo para 10 ejemplos al azar del dataset de validación.
                    print("Examples:")
                    for j in range(10):

                        # Extraemos una muestra.
                        prob_inputs, prob_targets, prob_original, prob_seq_len, _ = hw_utils.extract_ordered_batch(
                            ctc_input_len, 1, im_path,
                            csv_path + "validation1.csv", randint(0, 6086))
                        prob_feed = {
                            inputs: prob_inputs,
                            targets: prob_targets,
                            keep_prob: 1,
                            seq_len: prob_seq_len
                        }

                        # Obtenemos la salida y la mapeamos como una palabra para imprimirla por pantalla.
                        prob_d = session.run(decoded[0], feed_dict=prob_feed)
                        output = str(list(map(dct.get, list(prob_d.values))))
                        for ch in ["['", "']", "', '"]:
                            output = output.replace(ch, "")
                            prob_original = str(prob_original).replace(ch, "")
                        print("Target: " + prob_original +
                              "       Model Output: " + output)

        # Almacenamos los resultados
        val_result1.to_csv(results_path + "validation_result1.csv",
                           index=False)
        val_result2.to_csv(results_path + "validation_result2.csv",
                           index=False)
        train_result.to_csv(results_path + "training_result.csv", index=False)
        print("THE TRAINING IS OVER")
def run_ctc():

    if len(sys.argv) == 1:
        print(
            "Execution without arguments, config file by default: ./config.json"
        )
        config_file = str('./config.json')

    elif len(sys.argv) == 2:
        print("Execution with arguments, config file:" + str(sys.argv[1]))
        config_file = str(sys.argv[1])

    else:
        print()
        print("ERROR")
        print("Wrong number of arguments. Execute:")
        print(">> python3 test.py [path_config_file]")
        exit(1)

    try:
        config = json.load(open(config_file))
    except FileNotFoundError:
        print()
        print("ERROR")
        print("No such config file : " + config_file)
        exit(1)

    if not os.path.exists(str(config["IAM-test"]["results_path"])):
        os.mkdir(str(config["IAM-test"]["results_path"]))

    im_path = str(config["general"]["processed_data_path"])
    csv_path = str(config["IAM-test"]["csv_path"])
    results_path = str(config["IAM-test"]["results_path"])
    checkpoints_path = str(config["IAM-test"]["checkpoints_path"])
    height = int(config["general"]["height"])
    width = int(config["general"]["width"])
    dct = ast.literal_eval(str(config["general"]["dictionary"]))

    kernel_size = int(config["cnn-rnn-ctc"]["kernel_size"])
    num_conv1 = int(config["cnn-rnn-ctc"]["num_conv1"])
    num_conv2 = int(config["cnn-rnn-ctc"]["num_conv2"])
    num_conv3 = int(config["cnn-rnn-ctc"]["num_conv3"])
    num_conv4 = int(config["cnn-rnn-ctc"]["num_conv4"])
    num_conv5 = int(config["cnn-rnn-ctc"]["num_conv5"])
    num_rnn = int(config["cnn-rnn-ctc"]["num_rnn"])
    num_fc = int(config["cnn-rnn-ctc"]["num_fc"])
    num_classes = int(config["cnn-rnn-ctc"]["num_classes"])
    ctc_input_len = int(config["cnn-rnn-ctc"]["ctc_input_len"])

    model = ANN_model.CNN_RNN_CTC(kernel_size, num_conv1, num_conv2, num_conv3,
                                  num_conv4, num_conv5, num_rnn, num_fc,
                                  height, width, num_classes)
    graph = model[0]
    inputs = model[1]
    targets = model[2]
    keep_prob = model[3]
    seq_len = model[4]
    cost = model[6]
    ler = model[7]
    decoded = model[8]

    result_test = pd.DataFrame()
    config = tf.ConfigProto()
    config.gpu_options.allocator_type = 'BFC'

    with tf.Session(graph=graph, config=config) as session:

        saver = tf.train.Saver()
        saver.restore(
            session,
            "C:/Users/catarina/QRCodeDetection/Offline-Handwriting-Recognition-with-TensorFlow/Checkpoints/checkpoint_epoch_27400_ler_0.15915638256412773.ckpt"
        )  #hardcodded change it
        print("Loaded Model")

        cont = 0
        total_test_cost = 0
        total_test_ler = 0

        while cont >= 0:

            test_inputs, test_targets, original, test_seq_len, num_samples = hw_utils.extract_ordered_batch(
                ctc_input_len, 1, im_path, csv_path + "test_tickets.csv", cont)

            if num_samples == 1:

                test_feed = {
                    seq_len: test_seq_len,
                    inputs: test_inputs,
                    keep_prob: 1,
                    targets: test_targets
                }
                test_cost, test_ler = session.run([cost, ler], test_feed)
                total_test_cost += test_cost
                total_test_ler += test_ler

                dec = session.run(decoded[0], test_feed)
                output = str(list(map(dct.get, list(dec.values))))
                for ch in ["['", "']", "', '"]:
                    output = output.replace(ch, "")
                    original = str(original).replace(ch, "")
                tuple = {'Target': [original], 'Output': [output]}
                result_test = pd.concat([result_test, pd.DataFrame(tuple)])
                cont += 1

            else:

                print("IAM test result:")
                print("Cost: " + str(total_test_cost / (cont)))
                print("LER: " + str(total_test_ler / (cont)))
                result_test.to_csv(results_path + "test_result_tickets.csv",
                                   index=False)
                cont = -1
예제 #3
0
def run_ctc():

    # Ruta del archivo de configuración, pasada por argumentos o por defecto "./config.json".
    if len(sys.argv) == 1:
        print(
            "Execution without arguments, config file by default: ./config.json"
        )
        config_file = str('./config.json')

    elif len(sys.argv) == 2:
        print("Execution with arguments, config file:" + str(sys.argv[1]))
        config_file = str(sys.argv[1])

    else:
        print()
        print("ERROR")
        print("Wrong number of arguments. Execute:")
        print(">> python3 test.py [path_config_file]")
        exit(1)

    # Cargamos el archivo de configuración
    try:
        config = json.load(open(config_file))
    except FileNotFoundError:
        print()
        print("ERROR")
        print("No such config file : " + config_file)
        exit(1)

    # Si el directorio destino no existe, se crea.
    if not os.path.exists(str(config["IAM-test"]["results_path"])):
        os.mkdir(str(config["IAM-test"]["results_path"]))

    # Extraemos las variables generales para el test.
    im_path = str(config["general"]["processed_data_path"])
    csv_path = str(config["IAM-test"]["csv_path"])
    results_path = str(config["IAM-test"]["results_path"])
    checkpoints_path = str(config["IAM-test"]["checkpoints_path"])
    height = int(config["general"]["height"])
    width = int(config["general"]["width"])
    dct = ast.literal_eval(str(config["general"]["dictionary"]))

    # Extraemos los parametros del modelo a validar
    kernel_size = int(config["cnn-rnn-ctc"]["kernel_size"])
    num_conv1 = int(config["cnn-rnn-ctc"]["num_conv1"])
    num_conv2 = int(config["cnn-rnn-ctc"]["num_conv2"])
    num_conv3 = int(config["cnn-rnn-ctc"]["num_conv3"])
    num_conv4 = int(config["cnn-rnn-ctc"]["num_conv4"])
    num_conv5 = int(config["cnn-rnn-ctc"]["num_conv5"])
    num_rnn = int(config["cnn-rnn-ctc"]["num_rnn"])
    num_fc = int(config["cnn-rnn-ctc"]["num_fc"])
    num_classes = int(config["cnn-rnn-ctc"]["num_classes"])
    ctc_input_len = int(config["cnn-rnn-ctc"]["ctc_input_len"])

    # Creamos el modelo ANN
    model = ANN_model.CNN_RNN_CTC(kernel_size, num_conv1, num_conv2, num_conv3,
                                  num_conv4, num_conv5, num_rnn, num_fc,
                                  height, width, num_classes)
    graph = model[0]
    inputs = model[1]
    targets = model[2]
    keep_prob = model[3]
    seq_len = model[4]
    cost = model[6]
    ler = model[7]
    decoded = model[8]

    # Declaramos el DataFrames para almacenar la salidas del modelo para el Dataset completo.
    result_test = pd.DataFrame()

    # Creamos la sesión con el modelo previamente cargado.
    with tf.Session(graph=graph) as session:

        # Restauramos el valor de las variables del último modelo entrenado.
        saver = tf.train.Saver()
        saver.restore(session, tf.train.latest_checkpoint(checkpoints_path))
        print("Loaded Model")

        # Variables auxiliares.
        cont = 0
        total_test_cost = 0
        total_test_ler = 0

        # Bucle para realizar la validación sobre el Dataset completo
        while cont >= 0:

            # Extraemos las muestras 1 a 1 y de forma secuencial mediante "cont".
            test_inputs, test_targets, original, test_seq_len, num_samples = hw_utils.extract_ordered_batch(
                ctc_input_len, 1, im_path, csv_path + "test.csv", cont)

            # Se ha conseguido extraer la muestra para testearla.
            if num_samples == 1:

                # Calculamos el error de la CTC y el LER para dicha muestra.
                test_feed = {
                    seq_len: test_seq_len,
                    inputs: test_inputs,
                    keep_prob: 1,
                    targets: test_targets
                }
                test_cost, test_ler = session.run([cost, ler], test_feed)
                total_test_cost += test_cost
                total_test_ler += test_ler

                # Obtenemos la salida del modelo y la mapeamos como una palabra para almacenarla junto a la palabra objetivo.
                dec = session.run(decoded[0], test_feed)
                output = str(list(map(dct.get, list(dec.values))))
                for ch in ["['", "']", "', '"]:
                    output = output.replace(ch, "")
                    original = str(original).replace(ch, "")
                tuple = {'Target': [original], 'Output': [output]}
                result_test = pd.concat([result_test, pd.DataFrame(tuple)])
                cont += 1

            # No quedan más muestras en el Dataset de test.
            else:

                # Imprimimos los resultados del test y almacenamos las salidas del modelo.
                print("IAM test result:")
                print("Cost: " + str(total_test_cost / (cont)))
                print("LER: " + str(total_test_ler / (cont)))
                result_test.to_csv(results_path + "test_result.csv",
                                   index=False)
                cont = -1
def run_ctc():

    if len(sys.argv) == 1:
        print(
            "Execution without arguments, config file by default: ./config.json"
        )
        config_file = str('./config.json')

    elif len(sys.argv) == 2:
        print("Execution with arguments, config file:" + str(sys.argv[1]))
        config_file = str(sys.argv[1])

    else:
        print()
        print("ERROR")
        print("Wrong number of arguments. Execute:")
        print(">> python3 train.py [path_config_file]")
        exit(1)

    try:
        config = json.load(open(config_file))
    except FileNotFoundError:
        print()
        print("ERROR")
        print("No such config file : " + config_file)
        exit(1)

    if not os.path.exists(str(config["IAM-test"]["results_path"])):
        os.mkdir(str(config["IAM-test"]["results_path"]))
    if not os.path.exists(str(config["IAM-test"]["checkpoints_path"])):
        os.mkdir(str(config["IAM-test"]["checkpoints_path"]))

    im_path = str(config["general"]["processed_data_path"])
    csv_path = str(config["IAM-test"]["csv_path"])
    results_path = str(config["IAM-test"]["results_path"])
    checkpoints_path = str(config["IAM-test"]["checkpoints_path"])
    batch_size = int(config["IAM-test"]["batch_size"])
    num_epochs = int(config["IAM-test"]["num_epochs"])
    val_period = int(config["IAM-test"]["validation_period"])
    print_period = int(config["IAM-test"]["print_period"])
    height = int(config["general"]["height"])
    width = int(config["general"]["width"])
    dct = ast.literal_eval(str(config["general"]["dictionary"]))

    kernel_size = int(config["cnn-rnn-ctc"]["kernel_size"])
    num_conv1 = int(config["cnn-rnn-ctc"]["num_conv1"])
    num_conv2 = int(config["cnn-rnn-ctc"]["num_conv2"])
    num_conv3 = int(config["cnn-rnn-ctc"]["num_conv3"])
    num_conv4 = int(config["cnn-rnn-ctc"]["num_conv4"])
    num_conv5 = int(config["cnn-rnn-ctc"]["num_conv5"])
    num_rnn = int(config["cnn-rnn-ctc"]["num_rnn"])
    num_fc = int(config["cnn-rnn-ctc"]["num_fc"])
    num_classes = int(config["cnn-rnn-ctc"]["num_classes"])
    ctc_input_len = int(config["cnn-rnn-ctc"]["ctc_input_len"])

    model = ANN_model.CNN_RNN_CTC(kernel_size, num_conv1, num_conv2, num_conv3,
                                  num_conv4, num_conv5, num_rnn, num_fc,
                                  height, width, num_classes)
    graph = model[0]
    inputs = model[1]
    targets = model[2]
    keep_prob = model[3]
    seq_len = model[4]
    optimizer = model[5]
    cost = model[6]
    ler = model[7]
    decoded = model[8]

    train_result = pd.DataFrame()
    val_result1 = pd.DataFrame()
    val_result2 = pd.DataFrame()

    with tf.Session(graph=graph) as session:

        saver = tf.train.Saver()
        tf.global_variables_initializer().run()

        LER = 1.0

        for curr_epoch in range(num_epochs):

            train_inputs, train_targets, original, train_seq_len = hw_utils.extract_training_batch(
                ctc_input_len, batch_size, im_path, csv_path + "train.csv")
            feed = {
                inputs: train_inputs,
                targets: train_targets,
                keep_prob: 0.5,
                seq_len: train_seq_len
            }

            _ = session.run([optimizer], feed)

            if curr_epoch % val_period == 0:

                train_cost, train_ler = session.run([cost, ler], feed)
                train_tuple = {
                    'epoch': [curr_epoch],
                    'train_cost': [train_cost],
                    'train_ler': [train_ler]
                }
                train_result = pd.concat(
                    [train_result, pd.DataFrame(train_tuple)])

                val_tuple1 = hw_utils.validation(curr_epoch, ctc_input_len,
                                                 batch_size, im_path,
                                                 csv_path + "validation1.csv",
                                                 inputs, targets, keep_prob,
                                                 seq_len, session, cost, ler)
                val_result1 = pd.concat(
                    [val_result1, pd.DataFrame(val_tuple1)])

                val_tuple2 = hw_utils.validation(curr_epoch, ctc_input_len,
                                                 batch_size, im_path,
                                                 csv_path + "validation2.csv",
                                                 inputs, targets, keep_prob,
                                                 seq_len, session, cost, ler)
                val_result2 = pd.concat(
                    [val_result2, pd.DataFrame(val_tuple2)])

                if (float(val_tuple1['val_ler'][0]) +
                        float(val_tuple2['val_ler'][0])) / 2 <= LER:

                    save_path = saver.save(
                        session, checkpoints_path + "checkpoint_epoch_" +
                        str(curr_epoch) + "_ler_" + str(
                            (float(val_tuple1['val_ler'][0]) +
                             float(val_tuple2['val_ler'][0])) / 2) + ".ckpt")
                    global_step = ckpt.checkpoints_path.split('/')[-1].split(
                        'data')[-1]
                    print("Model saved in file: " + str(save_path))

                    LER = (float(val_tuple1['val_ler'][0]) +
                           float(val_tuple2['val_ler'][0])) / 2

                if curr_epoch % print_period == 0:

                    print("Epoch: " + str(curr_epoch) + " val_cost: " +
                          str((float(val_tuple1['val_cost'][0]) +
                               float(val_tuple2['val_cost'][0])) / 2) +
                          " val_ler: " +
                          str((float(val_tuple1['val_ler'][0]) +
                               float(val_tuple2['val_ler'][0])) / 2))

                    print("Examples:")
                    for j in range(10):

                        prob_inputs, prob_targets, prob_original, prob_seq_len, _ = hw_utils.extract_ordered_batch(
                            ctc_input_len, 1, im_path,
                            csv_path + "validation1.csv", randint(0, 6086))
                        prob_feed = {
                            inputs: prob_inputs,
                            targets: prob_targets,
                            keep_prob: 1,
                            seq_len: prob_seq_len
                        }

                        prob_d = session.run(decoded[0], feed_dict=prob_feed)
                        output = str(list(map(dct.get, list(prob_d.values))))
                        for ch in ["['", "']", "', '"]:
                            output = output.replace(ch, "")
                            prob_original = str(prob_original).replace(ch, "")
                        print("Target: " + prob_original +
                              "       Model Output: " + output)

        val_result1.to_csv(results_path + "validation_result1.csv",
                           index=False)
        val_result2.to_csv(results_path + "validation_result2.csv",
                           index=False)
        train_result.to_csv(results_path + "training_result.csv", index=False)
        print("THE TRAINING IS OVER")