コード例 #1
0
def evaluate_per_file(expid, file_list, audio_hop=882, sr=44100,
                      sequence_frames=128,
                      sequence_hop=64, normalize_data=True, mel_bands=40,
                      load_predictions=True):

    modelfolder = (
        '/scratch/js7561/datasets/scaper_waspaa2017/urban-sed/models')
    expfolder = os.path.join(modelfolder, expid)

    if load_predictions:

        ytestfile = os.path.join(expfolder, 'ytest.npy.gz')
        yprobfile = os.path.join(expfolder, 'yprob.npy.gz')
        yidfile = os.path.join(expfolder, 'yid.npy.gz')
        y_test = np.load(gzip.open(ytestfile, 'rb'))
        pred_test = np.load(gzip.open(yprobfile, 'rb'))
        id_test = np.load(gzip.open(yidfile, 'rb'))

        label_list = (['air_conditioner', 'car_horn', 'children_playing',
                       'dog_bark', 'drilling', 'engine_idling', 'gun_shot',
                       'jackhammer', 'siren', 'street_music'])
        label_list = sorted(label_list)
    else:

        # Build model and load in best weights
        model = build_crnn_onestep(n_freq_cnn=mel_bands)
        model.compile(optimizer='adam', loss='binary_crossentropy',
                      metrics=['accuracy'])
        weightfile = os.path.join(expfolder, 'weights_best.hdf5'.format(expid))
        model.load_weights(weightfile)

        # Load data
        (x_train, y_train, id_train, x_val, y_val, id_val, x_test, y_test,
         id_test, label_list, scaler) = load_urbansed_crnn(
            sequence_frames=sequence_frames, sequence_hop=sequence_hop,
            sequence_offset=0,
            audio_hop=audio_hop, sr=sr,
            verbose=False, normalize=normalize_data,
            mel_bands=mel_bands)


        pred_test = model.predict(x_test)


    # ONLY KEEP SAMPLES THAT ARE INCLUDED IN THE FILE LIST!
    y_test_filtered = []
    pred_test_filtered = []
    id_test_filtered = []
    for p, y, i in zip(pred_test, y_test, id_test):
        filename = os.path.basename(i[0]).replace('.npy.gz', '')
        if filename in file_list:
            y_test_filtered.append(y)
            pred_test_filtered.append(p)
            id_test_filtered.append(i)
    y_test_filtered = np.asarray(y_test_filtered)
    pred_test_filtered = np.asarray(pred_test_filtered)
    id_test_filtered = np.asarray(id_test_filtered)

    SegMetrics1s = sed_eval.sound_event.SegmentBasedMetrics(
        label_list, time_resolution=1.0)
    SegMetrics100ms = sed_eval.sound_event.SegmentBasedMetrics(
        label_list, time_resolution=0.1)

    # DO EVAL FILE BY FILES
    idx = 0
    while idx < len(id_test_filtered):

        y_test_file = []
        pred_test_file = []
        id_test_file = []

        current_id = id_test_filtered[idx][0]
        while idx < len(id_test_filtered) and id_test_filtered[idx][
            0] == current_id:
            y_test_file.append(y_test_filtered[idx])
            pred_test_file.append(pred_test_filtered[idx])
            id_test_file.append(id_test_filtered[idx])
            idx += 1
        y_test_file = np.asarray(y_test_file)
        pred_test_file = np.asarray(pred_test_file)
        id_test_file = np.asarray(id_test_file)

        est_roll, ref_roll = combine_event_rolls(pred_test_file,
                                                 y_test_file,
                                                 threshold=0.5)

        # COMPUTE FOLD RESULTS AND REPORT
        # Convert event rolls into even lists
        est_event_list = event_roll_to_event_list(
            est_roll, label_list, audio_hop/float(sr))
        ref_event_list = event_roll_to_event_list(
            ref_roll, label_list, audio_hop/float(sr))

        # Compute metrics at 1s and 100ms levels
        SegMetrics1s.evaluate(ref_event_list, est_event_list)
        SegMetrics100ms.evaluate(ref_event_list, est_event_list)

    results1s = SegMetrics1s.results()
    results100ms = SegMetrics100ms.results()

    # Report scores
    scores = (
        'F1s: {:.4f}, P1s: {:.4f}, R1s: {:.4f}, F100ms: {:.4f}, '
        'P100ms: {:.4f}, R100ms: {:.4f} | E1s: {:.4f}, '
        'E100ms: {:.4f}'.format(
            results1s['overall']['f_measure']['f_measure'],
            results1s['overall']['f_measure']['precision'],
            results1s['overall']['f_measure']['recall'],
            results100ms['overall']['f_measure']['f_measure'],
            results100ms['overall']['f_measure']['precision'],
            results100ms['overall']['f_measure']['recall'],
            results1s['overall']['error_rate']['error_rate'],
            results100ms['overall']['error_rate']['error_rate']
        ))
    print(scores)

    # Save scores
    results_all = {'results1s': results1s, 'results100ms': results100ms}
    results_all_file = os.path.join(expfolder, 'test_results_per_file.json')
    json.dump(results_all, open(results_all_file, 'w'), indent=2)

    return results_all
コード例 #2
0
def run_experiment_sedeval(expid,
                           epochs=1000,
                           metrics=['accuracy'],
                           sequence_hop=64,
                           batch_size=64,
                           audio_hop=882,
                           sr=44100,
                           sequence_frames=128,
                           epoch_limit=2048,
                           sed_early_stopping=100,
                           normalize_data=True,
                           fit_verbose=True,
                           mel_bands=40,
                           resume=False,
                           resume_f1_best=0,
                           load_subset=None):
    # Print out library versions
    print('Module versions:')
    print('keras version: {:s}'.format(keras.__version__))
    print('tensorflow version: {:s}'.format(tensorflow.__version__))
    print('numpy version: {:s}'.format(np.__version__))
    print('sklearn version: {:s}'.format(sklearn.__version__))

    # Create output folders
    modelfolder = '/scratch/js7561/datasets/scaper_waspaa2017/urban-sed/models'
    expfolder = os.path.join(modelfolder, expid)
    time.sleep(np.random.rand() * 10)  # prevents jobs clashing
    if not os.path.isdir(expfolder):
        os.mkdir(expfolder)

    # Build model
    print('\nBuilding model...')
    # model = build_crnn(n_freq_cnn=mel_bands)
    model = build_crnn_onestep(n_freq_cnn=mel_bands)
    model.compile(loss='binary_crossentropy',
                  optimizer='adam',
                  metrics=metrics)
    if resume:
        print('Loading best weights and resuming...')
        weights_best_file = os.path.join(expfolder, 'weights_best.hdf5')
        model.load_weights(weights_best_file)

    # Load data
    (x_train, y_train, id_train, x_val, y_val, id_val, x_test, y_test, id_test,
     label_list, scaler) = load_urbansed_crnn(sequence_frames=sequence_frames,
                                              sequence_hop=sequence_hop,
                                              sequence_offset=0,
                                              audio_hop=audio_hop,
                                              sr=sr,
                                              verbose=True,
                                              normalize=normalize_data,
                                              mel_bands=mel_bands,
                                              load_subset=load_subset)

    # Save scaler object
    scaler_file = os.path.join(expfolder, 'scaler.pkl')
    pickle.dump(scaler, open(scaler_file, 'wb'))

    # Fit model
    print('\nFitting model...')
    history_sed = []
    f1s_best = 0
    epoch_best = 0
    epochs_since_improvement = 0

    if resume:
        f1s_best = resume_f1_best

    for epoch in range(epochs):

        if epoch_limit is None:

            history = model.fit(x=x_train,
                                y=y_train,
                                batch_size=batch_size,
                                epochs=epoch + 1,
                                verbose=fit_verbose,
                                validation_split=0.0,
                                validation_data=(x_val, y_val),
                                shuffle=True,
                                initial_epoch=epoch)

            # Test using sed_eval
            pred = model.predict(x_val)
            est_roll, ref_roll = combine_event_rolls(pred,
                                                     y_test,
                                                     threshold=0.5)
            # ref_roll = y_val[:]
            # est_roll = 1 * (pred >= 0.5)
            est_event_list = event_roll_to_event_list(est_roll, label_list,
                                                      audio_hop / float(sr))
            ref_event_list = event_roll_to_event_list(ref_roll, label_list,
                                                      audio_hop / float(sr))

            seg_metrics1s = sed_eval.sound_event.SegmentBasedMetrics(
                label_list, time_resolution=1.0)
            seg_metrics1s.evaluate(ref_event_list, est_event_list)
            results1s = seg_metrics1s.results()

            seg_metrics100ms = sed_eval.sound_event.SegmentBasedMetrics(
                label_list, time_resolution=0.1)
            seg_metrics100ms.evaluate(ref_event_list, est_event_list)
            results100ms = seg_metrics100ms.results()

            scores = ('F1s: {:.4f}, P1s: {:.4f}, R1s: {:.4f}, F100ms: {:.4f}, '
                      'P100ms: {:.4f}, R100ms: {:.4f} | E1s: {:.4f}, '
                      'E100ms: {:.4f}'.format(
                          results1s['overall']['f_measure']['f_measure'],
                          results1s['overall']['f_measure']['precision'],
                          results1s['overall']['f_measure']['recall'],
                          results100ms['overall']['f_measure']['f_measure'],
                          results100ms['overall']['f_measure']['precision'],
                          results100ms['overall']['f_measure']['recall'],
                          results1s['overall']['error_rate']['error_rate'],
                          results100ms['overall']['error_rate']['error_rate']))
            history_sed.append([results1s, results100ms])
            print(scores)

            # Save weights if we see improvement
            f1s_current = results1s['overall']['f_measure']['f_measure']
            improvement = False
            if f1s_current > f1s_best:
                improvement = True
                f1s_best = f1s_current
                weights_best_file = os.path.join(expfolder,
                                                 'weights_best.hdf5')
                model.save_weights(weights_best_file)

                # ********************* CHECKPOINT ************************
                # Save history.history
                history_score_file = os.path.join(expfolder,
                                                  'history_scores.json')
                json.dump(history.history,
                          open(history_score_file, 'w'),
                          indent=2)
                # Save history_sed
                history_sed_file = os.path.join(expfolder, 'history_sed.json')
                json.dump(history_sed, open(history_sed_file, 'w'), indent=2)
                # Get predictions
                pred = model.predict(x_test)
                # Save Y_test, predictions and IDs
                ytestfile = os.path.join(expfolder, 'ytest.npy.gz')
                yprobfile = os.path.join(expfolder, 'yprob.npy.gz')
                yidfile = os.path.join(expfolder, 'yid.npy.gz')
                y_test.dump(gzip.open(ytestfile, 'wb'))
                pred.dump(gzip.open(yprobfile, 'wb'))
                id_test.dump(gzip.open(yidfile, 'wb'))

            if improvement:
                print(
                    '{:d} Best val F1s: {:.4f} (IMPROVEMENT, saving)\n'.format(
                        epoch, f1s_best))
                epochs_since_improvement = 0
                epoch_best = epoch
            else:
                print('{:d} Best val F1s: {:.4f} ({:d})\n'.format(
                    epoch, f1s_best, epoch_best))
                epochs_since_improvement += 1

        else:

            order = np.arange(x_train.shape[0])
            np.random.shuffle(order)

            idx = 0
            mini_epochs_per_epoch = int(
                np.floor(
                    (x_train.shape[0] - epoch_limit) / float(epoch_limit))) + 1
            mini_epoch = epoch * mini_epochs_per_epoch
            while idx < x_train.shape[0] - epoch_limit:

                history = model.fit(x=x_train[order[idx:idx + epoch_limit]],
                                    y=y_train[order[idx:idx + epoch_limit]],
                                    batch_size=batch_size,
                                    epochs=mini_epoch + 1,
                                    verbose=fit_verbose,
                                    validation_split=0.0,
                                    validation_data=(x_val, y_val),
                                    shuffle=True,
                                    initial_epoch=mini_epoch)

                idx += epoch_limit
                mini_epoch += 1

                # Test using sed_eval
                pred = model.predict(x_val)
                est_roll, ref_roll = combine_event_rolls(pred,
                                                         y_test,
                                                         threshold=0.5)
                # ref_roll = y_val[:]
                # est_roll = 1 * (pred >= 0.5)
                est_event_list = event_roll_to_event_list(
                    est_roll, label_list, audio_hop / float(sr))
                ref_event_list = event_roll_to_event_list(
                    ref_roll, label_list, audio_hop / float(sr))

                seg_metrics1s = sed_eval.sound_event.SegmentBasedMetrics(
                    label_list, time_resolution=1.0)
                seg_metrics1s.evaluate(ref_event_list, est_event_list)
                results1s = seg_metrics1s.results()

                seg_metrics100ms = sed_eval.sound_event.SegmentBasedMetrics(
                    label_list, time_resolution=0.1)
                seg_metrics100ms.evaluate(ref_event_list, est_event_list)
                results100ms = seg_metrics100ms.results()

                scores = (
                    'F1s: {:.4f}, P1s: {:.4f}, R1s: {:.4f}, F100ms: {:.4f}, '
                    'P100ms: {:.4f}, R100ms: {:.4f} | E1s: {:.4f}, '
                    'E100ms: {:.4f}'.format(
                        results1s['overall']['f_measure']['f_measure'],
                        results1s['overall']['f_measure']['precision'],
                        results1s['overall']['f_measure']['recall'],
                        results100ms['overall']['f_measure']['f_measure'],
                        results100ms['overall']['f_measure']['precision'],
                        results100ms['overall']['f_measure']['recall'],
                        results1s['overall']['error_rate']['error_rate'],
                        results100ms['overall']['error_rate']['error_rate']))
                history_sed.append([results1s, results100ms])
                print(scores)

                # Save weights if we see improvement
                f1s_current = results1s['overall']['f_measure']['f_measure']
                improvement = False
                if f1s_current > f1s_best:
                    improvement = True
                    f1s_best = f1s_current
                    weights_best_file = os.path.join(expfolder,
                                                     'weights_best.hdf5')
                    model.save_weights(weights_best_file)

                    # ********************* CHECKPOINT **********************
                    # Save history.history
                    history_score_file = os.path.join(expfolder,
                                                      'history_scores.json')
                    json.dump(history.history,
                              open(history_score_file, 'w'),
                              indent=2)
                    # Save history_sed
                    history_sed_file = os.path.join(expfolder,
                                                    'history_sed.json')
                    json.dump(history_sed,
                              open(history_sed_file, 'w'),
                              indent=2)
                    # Get predictions
                    pred = model.predict(x_test)
                    # Save Y_test, predictions and IDs
                    ytestfile = os.path.join(expfolder, 'ytest.npy.gz')
                    yprobfile = os.path.join(expfolder, 'yprob.npy.gz')
                    yidfile = os.path.join(expfolder, 'yid.npy.gz')
                    y_test.dump(gzip.open(ytestfile, 'wb'))
                    pred.dump(gzip.open(yprobfile, 'wb'))
                    id_test.dump(gzip.open(yidfile, 'wb'))

                if improvement:
                    print('{:d} Best val F1s: {:.4f} (IMPROVEMENT, '
                          'saving)\n'.format(mini_epoch, f1s_best))
                    epochs_since_improvement = 0
                    epoch_best = mini_epoch
                else:
                    print('{:d} Best val F1s: {:.4f} ({:d})\n'.format(
                        mini_epoch, f1s_best, epoch_best))
                    epochs_since_improvement += 1

                if ((sed_early_stopping is not None)
                        and (epochs_since_improvement >= sed_early_stopping)):
                    print('\nNo improvement for {:d} epochs, stopping.'.format(
                        sed_early_stopping))
                    break

        if ((sed_early_stopping is not None)
                and (epochs_since_improvement >= sed_early_stopping)):
            print('\nNo improvement for {:d} epochs, stopping.'.format(
                sed_early_stopping))
            break

    # # Training curves
    # plot_training_curves(history)

    # Save model and predictions to disk
    print('\nSaving model and predictions to disk...')
    modeljsonfile = os.path.join(expfolder, 'model.json')
    model_json = model.to_json()
    with open(modeljsonfile, 'w') as json_file:
        json.dump(model_json, json_file, indent=2)

    # Save last version of weights (for resuming training)
    weights_last_file = os.path.join(expfolder, 'weights_last.hdf5')
    model.save_weights(weights_last_file)

    # Save history.history
    history_score_file = os.path.join(expfolder, 'history_scores.json')
    json.dump(history.history, open(history_score_file, 'w'), indent=2)

    # Save history_sed
    history_sed_file = os.path.join(expfolder, 'history_sed.json')
    json.dump(history_sed, open(history_sed_file, 'w'), indent=2)

    # Save scaler object
    scaler_file = os.path.join(expfolder, 'scaler.pkl')
    pickle.dump(scaler, open(scaler_file, 'wb'))

    # Save Y_test, predictions and IDs
    ytestfile = os.path.join(expfolder, 'ytest.npy.gz')
    yprobfile = os.path.join(expfolder, 'yprob.npy.gz')
    yidfile = os.path.join(expfolder, 'yid.npy.gz')

    y_test.dump(gzip.open(ytestfile, 'wb'))
    id_test.dump(gzip.open(yidfile, 'wb'))

    # Get predictions
    model.load_weights(weights_best_file)
    pred = model.predict(x_test)
    pred.dump(gzip.open(yprobfile, 'wb'))

    print("Done.")
コード例 #3
0
def evaluate(expid, audio_hop=882, sr=44100, sequence_frames=128,
             sequence_hop=64, normalize_data=True, mel_bands=40,
             load_predictions=True, save_results=True):

    fold_results = []

    modelfolder = (
        '/scratch/js7561/datasets/scaper_waspaa2017/urban-sed/models')
    expfolder = os.path.join(modelfolder, expid)

    if load_predictions:

        ytestfile = os.path.join(expfolder, 'ytest.npy.gz')
        yprobfile = os.path.join(expfolder, 'yprob.npy.gz')
        yidfile = os.path.join(expfolder, 'yid.npy.gz')
        y_test = np.load(gzip.open(ytestfile, 'rb'))
        pred_test = np.load(gzip.open(yprobfile, 'rb'))
        id_test = np.load(gzip.open(yidfile, 'rb'))

        label_list = (['air_conditioner', 'car_horn', 'children_playing',
                       'dog_bark', 'drilling', 'engine_idling', 'gun_shot',
                       'jackhammer', 'siren', 'street_music'])
        label_list = sorted(label_list)
    else:

        # Build model and load in best weights
        model = build_crnn_onestep(n_freq_cnn=mel_bands)
        model.compile(optimizer='adam', loss='binary_crossentropy',
                      metrics=['accuracy'])
        weightfile = os.path.join(expfolder, 'weights_best.hdf5'.format(expid))
        model.load_weights(weightfile)

        # Load data
        (x_train, y_train, id_train, x_val, y_val, id_val, x_test, y_test,
         id_test, label_list, scaler) = load_urbansed_crnn(
            sequence_frames=sequence_frames, sequence_hop=sequence_hop,
            sequence_offset=0,
            audio_hop=audio_hop, sr=sr,
            verbose=False, normalize=normalize_data,
            mel_bands=mel_bands)


        pred_test = model.predict(x_test)


    est_roll, ref_roll = combine_event_rolls(pred_test, y_test,
                                             threshold=0.5)
    # ref_roll = y_test[:]
    # est_roll = 1 * (pred_test >= 0.5)

    # COMPUTE FOLD RESULTS AND REPORT
    # Convert event rolls into even lists
    est_event_list = event_roll_to_event_list(
        est_roll, label_list, audio_hop/float(sr))
    ref_event_list = event_roll_to_event_list(
        ref_roll, label_list, audio_hop/float(sr))

    # Compute metrics at 1s, 100ms and 20ms levels
    seg_metrics1s = sed_eval.sound_event.SegmentBasedMetrics(
        label_list, time_resolution=1.0)
    seg_metrics1s.evaluate(ref_event_list, est_event_list)
    results1s = seg_metrics1s.results()

    seg_metrics100ms = sed_eval.sound_event.SegmentBasedMetrics(
        label_list, time_resolution=0.1)
    seg_metrics100ms.evaluate(ref_event_list, est_event_list)
    results100ms = seg_metrics100ms.results()

    seg_metrics20ms = sed_eval.sound_event.SegmentBasedMetrics(
        label_list, time_resolution=0.020)
    seg_metrics20ms.evaluate(ref_event_list, est_event_list)
    results20ms = seg_metrics20ms.results()

    fold_results.append([results1s, results100ms, results20ms])

    # Report scores
    scores = (
        'F1s: {:.4f}, P1s: {:.4f}, R1s: {:.4f}, F100ms: {:.4f}, '
        'P100ms: {:.4f}, R100ms: {:.4f} | E1s: {:.4f}, '
        'E100ms: {:.4f}'.format(
            results1s['overall']['f_measure']['f_measure'],
            results1s['overall']['f_measure']['precision'],
            results1s['overall']['f_measure']['recall'],
            results100ms['overall']['f_measure']['f_measure'],
            results100ms['overall']['f_measure']['precision'],
            results100ms['overall']['f_measure']['recall'],
            results1s['overall']['error_rate']['error_rate'],
            results100ms['overall']['error_rate']['error_rate']
        ))
    print(scores)

    # Save scores
    results_all = {'results1s': results1s,
                   'results100ms': results100ms,
                   'results20ms': results20ms}

    if save_results:
        results_all_file = os.path.join(expfolder, 'test_results.json')
        json.dump(results_all, open(results_all_file, 'w'), indent=2)

    return results_all
コード例 #4
0
def evaluate_load_test(expid,
                       audio_hop=882,
                       sr=44100,
                       sequence_frames=50,
                       sequence_hop=25,
                       normalize_data=True,
                       mel_bands=128,
                       large_cnn=False,
                       frame_level_y=False):

    modelfolder = (
        '/scratch/js7561/datasets/scaper_waspaa2017/urban-sed/models')
    expfolder = os.path.join(modelfolder, expid)

    # Build model and load in best weights
    model = build_custom_cnn(n_freq_cnn=mel_bands, large_cnn=large_cnn)
    model.compile(optimizer='adam',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    weightfile = os.path.join(expfolder, 'weights_best.hdf5'.format(expid))
    model.load_weights(weightfile)

    # Load data
    (x_test, y_test, id_test, label_list,
     scaler) = load_urbansed_cnn_test(expid,
                                      sequence_frames=sequence_frames,
                                      audio_hop=audio_hop,
                                      sr=sr,
                                      verbose=False,
                                      normalize=normalize_data,
                                      mel_bands=mel_bands,
                                      frame_level_y=frame_level_y,
                                      load_subset=False,
                                      file_list=None)

    pred_test = model.predict(x_test)

    if frame_level_y:
        ref_roll = combine_event_rolls_single(y_test, threshold=None)
    else:
        ref_roll = y_test[:]

    est_roll = 1 * (pred_test >= 0.5)

    # COMPUTE FOLD RESULTS AND REPORT
    # Convert event rolls into even lists
    if frame_level_y:
        est_event_list = event_roll_to_event_list(est_roll, label_list, 1.0)
        ref_event_list = event_roll_to_event_list(ref_roll, label_list,
                                                  audio_hop / float(sr))
    else:
        est_event_list = event_roll_to_event_list(est_roll, label_list, 1.0)
        ref_event_list = event_roll_to_event_list(ref_roll, label_list, 1.0)

    # Compute metrics at 1s and 100ms levels
    seg_metrics1s = sed_eval.sound_event.SegmentBasedMetrics(
        label_list, time_resolution=1.0)
    seg_metrics1s.evaluate(ref_event_list, est_event_list)
    results1s = seg_metrics1s.results()

    seg_metrics100ms = sed_eval.sound_event.SegmentBasedMetrics(
        label_list, time_resolution=0.1)
    seg_metrics100ms.evaluate(ref_event_list, est_event_list)
    results100ms = seg_metrics100ms.results()

    # Report scores
    scores = ('F1s: {:.4f}, P1s: {:.4f}, R1s: {:.4f}, F100ms: {:.4f}, '
              'P100ms: {:.4f}, R100ms: {:.4f} | E1s: {:.4f}, '
              'E100ms: {:.4f}'.format(
                  results1s['overall']['f_measure']['f_measure'],
                  results1s['overall']['f_measure']['precision'],
                  results1s['overall']['f_measure']['recall'],
                  results100ms['overall']['f_measure']['f_measure'],
                  results100ms['overall']['f_measure']['precision'],
                  results100ms['overall']['f_measure']['recall'],
                  results1s['overall']['error_rate']['error_rate'],
                  results100ms['overall']['error_rate']['error_rate']))
    print(scores)

    # Save scores
    results_all = {'results1s': results1s, 'results100ms': results100ms}
    results_all_file = os.path.join(expfolder, 'test_results_load.json')
    json.dump(results_all, open(results_all_file, 'w'), indent=2)

    return results_all