summaryrefslogtreecommitdiff
path: root/OASIS/c/src/main.c
blob: ef8918d54049429dc5321788bc9ae13ce92109bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "main.h"

// uint64_t seconds() {
//     struct timespec start;
//     clock_gettime(CLOCK_MONOTONIC_RAW, &start);
//     return start.tv_sec;
// }

int main() {
    // uint64_t start = seconds();
    // Allocate memory
    char** file_names = (char**) malloc((NUM_IMAGES) * sizeof(char*));
    for (uint8_t i=0; i<NUM_IMAGES; i++) {
        file_names[i] = (char*) malloc(FILE_NAME_SIZE * sizeof(char));
        // Populate file name array with file path
        file_names[i] = (i < NUM_DNEG_IMAGES) ? strcpy(file_names[i], DNEG_FOLDER_PATH) : strcpy(file_names[i], DPOS_FOLDER_PATH);
    }   
    uint8_t*** data = (uint8_t***) malloc((NUM_IMAGES) * sizeof(uint8_t**));
    for (uint8_t i=0; i<NUM_IMAGES; i++) {
        data[i] = (uint8_t**) malloc(IMAGE_HEIGHT * sizeof(uint8_t*)); 
        for (uint8_t j=0; j<IMAGE_HEIGHT; j++) data[i][j] = (uint8_t*)malloc(IMAGE_WIDTH * sizeof(uint8_t));
    }

    float** data_flatten = (float**) malloc((NUM_IMAGES) * sizeof(float*));
    for (uint8_t i=0; i<NUM_IMAGES; i++) data_flatten[i] = (float*) malloc(FEATURE_VECTOR_SIZE * sizeof(float));

    int32_t* labels = (int32_t*) malloc((NUM_IMAGES) * sizeof(int32_t));

    uint8_t num_train = (uint8_t) (0.8 * NUM_IMAGES);
    uint8_t num_test = NUM_IMAGES - num_train;

    float** data_train = (float**) malloc (num_train * sizeof(float*));
    float** data_test = (float**) malloc (num_test * sizeof(float*));

    int32_t* labels_train = (int32_t*) malloc(num_train * sizeof(int32_t));
    int32_t* labels_test = (int32_t*) malloc(num_test * sizeof(int32_t));

    float** data_reduced_dimensions = (float**) malloc((NUM_IMAGES) * sizeof(float*));
    for (uint32_t i=0; i<NUM_IMAGES; i++) data_reduced_dimensions[i] = (float*) malloc(NUM_COMPONENTS * sizeof(float));

    float* alphas = (float*) malloc((NUM_IMAGES) * sizeof(float));

    // Concatenate the file name array with the image name
    read_dir(DNEG_FOLDER_PATH, DPOS_FOLDER_PATH, file_names);
    printf("read\n");

    // Read in an array of 2D images, then flatten
    for (uint8_t i=0; i<NUM_IMAGES; i++) {
        labels[i] = (i < NUM_DNEG_IMAGES) ? -1 : 1;
        read_bmp(file_names[i], data[i]);
        flatten_image(data[i], data_flatten[i]);
    }

    printf("flattened\n");

    // PCA Transform
    pca_covariance_method(data_flatten, NUM_IMAGES, FEATURE_VECTOR_SIZE, data_reduced_dimensions, NUM_COMPONENTS);
    printf("pca\n");

    // Shuffle data and labels
    shuffle_data_labels(data_reduced_dimensions, labels, NUM_IMAGES);
    printf("shuffled\n");

    // Populate the training and testing data
    for (uint8_t i=0; i<num_train; i++) {
        data_train[i] = data_reduced_dimensions[i];
        labels_train[i] = labels[i];
    }

    for (uint8_t i=num_train; i<NUM_IMAGES; i++) {
        data_test[i - num_train] = data_reduced_dimensions[i];
        labels_test[i - num_train] = labels[i];
    }

    printf("split\n");

    // Train SVM
    float bias;
    train_svm(data_train, num_train, NUM_COMPONENTS, alphas, &bias, labels, PENALTY_PARAM);
    printf("trained\n");

    // Test SVM
    float accuracy = test_svm(data_test, labels_test, num_test, NUM_COMPONENTS, alphas, bias);
    printf("Accuracy: %.2f%%\n", accuracy);
 
    // Free memory
    for (uint8_t i=0; i<NUM_IMAGES; i++) {
        free(file_names[i]);
        free(data_flatten[i]);
        free(data_reduced_dimensions[i]);
        for (uint8_t j=0; j<IMAGE_HEIGHT; j++) free(data[i][j]);
        free(data[i]);
    }
    free(file_names);
    free(data);
    free(data_flatten);
    free(data_reduced_dimensions);
    free(labels);
    free(labels_train);
    free(labels_test);
    free(data_train);
    free(data_test);
    free(alphas);

    // uint64_t end = seconds();
    // printf("Time Elapsed: %lds\n", end-start);
    return 0;
}