| | |
| | | #include <stdlib.h> |
| | | #include <string.h> |
| | | |
| | | unsigned int data_seed; |
| | | |
| | | struct load_args{ |
| | | char **paths; |
| | | int n; |
| | |
| | | char **random_paths = calloc(n, sizeof(char*)); |
| | | int i; |
| | | for(i = 0; i < n; ++i){ |
| | | int index = rand()%m; |
| | | int index = rand_r(&data_seed)%m; |
| | | random_paths[i] = paths[index]; |
| | | if(i == 0) printf("%s\n", paths[index]); |
| | | } |
| | |
| | | |
| | | for(i = 0; i < n; ++i){ |
| | | image im = load_image_color(paths[i], w, h); |
| | | translate_image(im, -128); |
| | | scale_image(im, 1./128); |
| | | float rad = rand_uniform() - .5; |
| | | image rot = rotate_image(im, rad); |
| | | free_image(im); |
| | | im = rot; |
| | | X.vals[i] = im.data; |
| | | X.cols = im.h*im.w*im.c; |
| | | } |
| | | return X; |
| | | } |
| | | |
| | | typedef struct box{ |
| | | typedef struct{ |
| | | int id; |
| | | float x,y,w,h; |
| | | float left, right, top, bottom; |
| | | } box; |
| | | } box_label; |
| | | |
| | | box *read_boxes(char *filename, int *n) |
| | | box_label *read_boxes(char *filename, int *n) |
| | | { |
| | | box *boxes = calloc(1, sizeof(box)); |
| | | box_label *boxes = calloc(1, sizeof(box_label)); |
| | | FILE *file = fopen(filename, "r"); |
| | | if(!file) file_error(filename); |
| | | float x, y, h, w; |
| | | int id; |
| | | int count = 0; |
| | | while(fscanf(file, "%d %f %f %f %f", &id, &x, &y, &w, &h) == 5){ |
| | | boxes = realloc(boxes, (count+1)*sizeof(box)); |
| | | boxes = realloc(boxes, (count+1)*sizeof(box_label)); |
| | | boxes[count].id = id; |
| | | boxes[count].x = x; |
| | | boxes[count].y = y; |
| | |
| | | return boxes; |
| | | } |
| | | |
| | | void randomize_boxes(box *b, int n) |
| | | void randomize_boxes(box_label *b, int n) |
| | | { |
| | | int i; |
| | | for(i = 0; i < n; ++i){ |
| | | box swap = b[i]; |
| | | int index = rand()%n; |
| | | box_label swap = b[i]; |
| | | int index = rand_r(&data_seed)%n; |
| | | b[i] = b[index]; |
| | | b[index] = swap; |
| | | } |
| | |
| | | labelpath = find_replace(labelpath, ".jpg", ".txt"); |
| | | labelpath = find_replace(labelpath, ".JPEG", ".txt"); |
| | | int count = 0; |
| | | box *boxes = read_boxes(labelpath, &count); |
| | | box_label *boxes = read_boxes(labelpath, &count); |
| | | randomize_boxes(boxes, count); |
| | | float x,y,w,h; |
| | | float left, top, right, bot; |
| | |
| | | if(background) truth[index++] = 0; |
| | | truth[index+id] = 1; |
| | | index += classes; |
| | | truth[index++] = y; |
| | | truth[index++] = x; |
| | | truth[index++] = h; |
| | | truth[index++] = y; |
| | | truth[index++] = w; |
| | | truth[index++] = h; |
| | | } |
| | | free(boxes); |
| | | } |
| | |
| | | d.y = make_matrix(n, k); |
| | | for(i = 0; i < n; ++i){ |
| | | image orig = load_image_color(random_paths[i], 0, 0); |
| | | float exposure = rand_uniform()+1; |
| | | if(rand_uniform() > .5) exposure = 1/exposure; |
| | | |
| | | float saturation = rand_uniform()+1; |
| | | if(rand_uniform() > .5) saturation = 1/saturation; |
| | | |
| | | int oh = orig.h; |
| | | int ow = orig.w; |
| | | |
| | |
| | | |
| | | float sx = (float)swidth / ow; |
| | | float sy = (float)sheight / oh; |
| | | |
| | | /* |
| | | float angle = rand_uniform()*.1 - .05; |
| | | image rot = rotate_image(orig, angle); |
| | | free_image(orig); |
| | | orig = rot; |
| | | */ |
| | | |
| | | int flip = rand()%2; |
| | | int flip = rand_r(&data_seed)%2; |
| | | image cropped = crop_image(orig, pleft, ptop, swidth, sheight); |
| | | float dx = ((float)pleft/ow)/sx; |
| | | float dy = ((float)ptop /oh)/sy; |
| | |
| | | |
| | | void *load_detection_thread(void *ptr) |
| | | { |
| | | printf("Loading data: %d\n", rand()); |
| | | printf("Loading data: %d\n", rand_r(&data_seed)); |
| | | struct load_args a = *(struct load_args*)ptr; |
| | | *a.d = load_data_detection_jitter_random(a.n, a.paths, a.m, a.classes, a.w, a.h, a.num_boxes, a.background); |
| | | translate_data_rows(*a.d, -128); |
| | | scale_data_rows(*a.d, 1./128); |
| | | free(ptr); |
| | | return 0; |
| | | } |
| | |
| | | return thread; |
| | | } |
| | | |
| | | matrix concat_matrix(matrix m1, matrix m2) |
| | | { |
| | | int i, count = 0; |
| | | matrix m; |
| | | m.cols = m1.cols; |
| | | m.rows = m1.rows+m2.rows; |
| | | m.vals = calloc(m1.rows + m2.rows, sizeof(float*)); |
| | | for(i = 0; i < m1.rows; ++i){ |
| | | m.vals[count++] = m1.vals[i]; |
| | | } |
| | | for(i = 0; i < m2.rows; ++i){ |
| | | m.vals[count++] = m2.vals[i]; |
| | | } |
| | | return m; |
| | | } |
| | | |
| | | data concat_data(data d1, data d2) |
| | | { |
| | | data d; |
| | | d.shallow = 1; |
| | | d.X = concat_matrix(d1.X, d2.X); |
| | | d.y = concat_matrix(d1.y, d2.y); |
| | | return d; |
| | | } |
| | | |
| | | data load_categorical_data_csv(char *filename, int target, int k) |
| | | { |
| | | data d; |
| | |
| | | X.vals[i][j] = (double)bytes[j+1]; |
| | | } |
| | | } |
| | | translate_data_rows(d, -144); |
| | | translate_data_rows(d, -128); |
| | | scale_data_rows(d, 1./128); |
| | | //normalize_data_rows(d); |
| | | fclose(fp); |
| | |
| | | { |
| | | int j; |
| | | for(j = 0; j < n; ++j){ |
| | | int index = rand()%d.X.rows; |
| | | int index = rand_r(&data_seed)%d.X.rows; |
| | | memcpy(X+j*d.X.cols, d.X.vals[index], d.X.cols*sizeof(float)); |
| | | memcpy(y+j*d.y.cols, d.y.vals[index], d.y.cols*sizeof(float)); |
| | | } |
| | |
| | | fclose(fp); |
| | | } |
| | | //normalize_data_rows(d); |
| | | translate_data_rows(d, -144); |
| | | translate_data_rows(d, -128); |
| | | scale_data_rows(d, 1./128); |
| | | return d; |
| | | } |
| | |
| | | { |
| | | int i; |
| | | for(i = d.X.rows-1; i > 0; --i){ |
| | | int index = rand()%i; |
| | | int index = rand_r(&data_seed)%i; |
| | | float *swap = d.X.vals[index]; |
| | | d.X.vals[index] = d.X.vals[i]; |
| | | d.X.vals[i] = swap; |