darknet  v3
data.c
Go to the documentation of this file.
1 #include "data.h"
2 #include "utils.h"
3 #include "image.h"
4 #include "cuda.h"
5 
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 
10 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
11 
12 list *get_paths(char *filename)
13 {
14  char *path;
15  FILE *file = fopen(filename, "r");
16  if(!file) file_error(filename);
17  list *lines = make_list();
18  while((path=fgetl(file))){
19  list_insert(lines, path);
20  }
21  fclose(file);
22  return lines;
23 }
24 
25 /*
26 char **get_random_paths_indexes(char **paths, int n, int m, int *indexes)
27 {
28  char **random_paths = calloc(n, sizeof(char*));
29  int i;
30  pthread_mutex_lock(&mutex);
31  for(i = 0; i < n; ++i){
32  int index = rand()%m;
33  indexes[i] = index;
34  random_paths[i] = paths[index];
35  if(i == 0) printf("%s\n", paths[index]);
36  }
37  pthread_mutex_unlock(&mutex);
38  return random_paths;
39 }
40 */
41 
42 char **get_random_paths(char **paths, int n, int m)
43 {
44  char **random_paths = calloc(n, sizeof(char*));
45  int i;
46  pthread_mutex_lock(&mutex);
47  for(i = 0; i < n; ++i){
48  int index = rand()%m;
49  random_paths[i] = paths[index];
50  //if(i == 0) printf("%s\n", paths[index]);
51  }
52  pthread_mutex_unlock(&mutex);
53  return random_paths;
54 }
55 
56 char **find_replace_paths(char **paths, int n, char *find, char *replace)
57 {
58  char **replace_paths = calloc(n, sizeof(char*));
59  int i;
60  for(i = 0; i < n; ++i){
61  char replaced[4096];
62  find_replace(paths[i], find, replace, replaced);
63  replace_paths[i] = copy_string(replaced);
64  }
65  return replace_paths;
66 }
67 
68 matrix load_image_paths_gray(char **paths, int n, int w, int h)
69 {
70  int i;
71  matrix X;
72  X.rows = n;
73  X.vals = calloc(X.rows, sizeof(float*));
74  X.cols = 0;
75 
76  for(i = 0; i < n; ++i){
77  image im = load_image(paths[i], w, h, 3);
78 
79  image gray = grayscale_image(im);
80  free_image(im);
81  im = gray;
82 
83  X.vals[i] = im.data;
84  X.cols = im.h*im.w*im.c;
85  }
86  return X;
87 }
88 
89 matrix load_image_paths(char **paths, int n, int w, int h)
90 {
91  int i;
92  matrix X;
93  X.rows = n;
94  X.vals = calloc(X.rows, sizeof(float*));
95  X.cols = 0;
96 
97  for(i = 0; i < n; ++i){
98  image im = load_image_color(paths[i], w, h);
99  X.vals[i] = im.data;
100  X.cols = im.h*im.w*im.c;
101  }
102  return X;
103 }
104 
105 matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center)
106 {
107  int i;
108  matrix X;
109  X.rows = n;
110  X.vals = calloc(X.rows, sizeof(float*));
111  X.cols = 0;
112 
113  for(i = 0; i < n; ++i){
114  image im = load_image_color(paths[i], 0, 0);
115  image crop;
116  if(center){
117  crop = center_crop_image(im, size, size);
118  } else {
119  crop = random_augment_image(im, angle, aspect, min, max, size, size);
120  }
121  int flip = rand()%2;
122  if (flip) flip_image(crop);
123  random_distort_image(crop, hue, saturation, exposure);
124 
125  /*
126  show_image(im, "orig");
127  show_image(crop, "crop");
128  cvWaitKey(0);
129  */
130  //grayscale_image_3c(crop);
131  free_image(im);
132  X.vals[i] = crop.data;
133  X.cols = crop.h*crop.w*crop.c;
134  }
135  return X;
136 }
137 
138 
139 box_label *read_boxes(char *filename, int *n)
140 {
141  FILE *file = fopen(filename, "r");
142  if(!file) file_error(filename);
143  float x, y, h, w;
144  int id;
145  int count = 0;
146  int size = 64;
147  box_label *boxes = calloc(size, sizeof(box_label));
148  while(fscanf(file, "%d %f %f %f %f", &id, &x, &y, &w, &h) == 5){
149  if(count == size) {
150  size = size * 2;
151  boxes = realloc(boxes, size*sizeof(box_label));
152  }
153  boxes[count].id = id;
154  boxes[count].x = x;
155  boxes[count].y = y;
156  boxes[count].h = h;
157  boxes[count].w = w;
158  boxes[count].left = x - w/2;
159  boxes[count].right = x + w/2;
160  boxes[count].top = y - h/2;
161  boxes[count].bottom = y + h/2;
162  ++count;
163  }
164  fclose(file);
165  *n = count;
166  return boxes;
167 }
168 
169 void randomize_boxes(box_label *b, int n)
170 {
171  int i;
172  for(i = 0; i < n; ++i){
173  box_label swap = b[i];
174  int index = rand()%n;
175  b[i] = b[index];
176  b[index] = swap;
177  }
178 }
179 
180 void correct_boxes(box_label *boxes, int n, float dx, float dy, float sx, float sy, int flip)
181 {
182  int i;
183  for(i = 0; i < n; ++i){
184  if(boxes[i].x == 0 && boxes[i].y == 0) {
185  boxes[i].x = 999999;
186  boxes[i].y = 999999;
187  boxes[i].w = 999999;
188  boxes[i].h = 999999;
189  continue;
190  }
191  boxes[i].left = boxes[i].left * sx - dx;
192  boxes[i].right = boxes[i].right * sx - dx;
193  boxes[i].top = boxes[i].top * sy - dy;
194  boxes[i].bottom = boxes[i].bottom* sy - dy;
195 
196  if(flip){
197  float swap = boxes[i].left;
198  boxes[i].left = 1. - boxes[i].right;
199  boxes[i].right = 1. - swap;
200  }
201 
202  boxes[i].left = constrain(0, 1, boxes[i].left);
203  boxes[i].right = constrain(0, 1, boxes[i].right);
204  boxes[i].top = constrain(0, 1, boxes[i].top);
205  boxes[i].bottom = constrain(0, 1, boxes[i].bottom);
206 
207  boxes[i].x = (boxes[i].left+boxes[i].right)/2;
208  boxes[i].y = (boxes[i].top+boxes[i].bottom)/2;
209  boxes[i].w = (boxes[i].right - boxes[i].left);
210  boxes[i].h = (boxes[i].bottom - boxes[i].top);
211 
212  boxes[i].w = constrain(0, 1, boxes[i].w);
213  boxes[i].h = constrain(0, 1, boxes[i].h);
214  }
215 }
216 
217 void fill_truth_swag(char *path, float *truth, int classes, int flip, float dx, float dy, float sx, float sy)
218 {
219  char labelpath[4096];
220  find_replace(path, "images", "labels", labelpath);
221  find_replace(labelpath, "JPEGImages", "labels", labelpath);
222  find_replace(labelpath, ".jpg", ".txt", labelpath);
223  find_replace(labelpath, ".JPG", ".txt", labelpath);
224  find_replace(labelpath, ".JPEG", ".txt", labelpath);
225 
226  int count = 0;
227  box_label *boxes = read_boxes(labelpath, &count);
228  randomize_boxes(boxes, count);
229  correct_boxes(boxes, count, dx, dy, sx, sy, flip);
230  float x,y,w,h;
231  int id;
232  int i;
233 
234  for (i = 0; i < count && i < 90; ++i) {
235  x = boxes[i].x;
236  y = boxes[i].y;
237  w = boxes[i].w;
238  h = boxes[i].h;
239  id = boxes[i].id;
240 
241  if (w < .0 || h < .0) continue;
242 
243  int index = (4+classes) * i;
244 
245  truth[index++] = x;
246  truth[index++] = y;
247  truth[index++] = w;
248  truth[index++] = h;
249 
250  if (id < classes) truth[index+id] = 1;
251  }
252  free(boxes);
253 }
254 
255 void fill_truth_region(char *path, float *truth, int classes, int num_boxes, int flip, float dx, float dy, float sx, float sy)
256 {
257  char labelpath[4096];
258  find_replace(path, "images", "labels", labelpath);
259  find_replace(labelpath, "JPEGImages", "labels", labelpath);
260 
261  find_replace(labelpath, ".jpg", ".txt", labelpath);
262  find_replace(labelpath, ".png", ".txt", labelpath);
263  find_replace(labelpath, ".JPG", ".txt", labelpath);
264  find_replace(labelpath, ".JPEG", ".txt", labelpath);
265  int count = 0;
266  box_label *boxes = read_boxes(labelpath, &count);
267  randomize_boxes(boxes, count);
268  correct_boxes(boxes, count, dx, dy, sx, sy, flip);
269  float x,y,w,h;
270  int id;
271  int i;
272 
273  for (i = 0; i < count; ++i) {
274  x = boxes[i].x;
275  y = boxes[i].y;
276  w = boxes[i].w;
277  h = boxes[i].h;
278  id = boxes[i].id;
279 
280  if (w < .005 || h < .005) continue;
281 
282  int col = (int)(x*num_boxes);
283  int row = (int)(y*num_boxes);
284 
285  x = x*num_boxes - col;
286  y = y*num_boxes - row;
287 
288  int index = (col+row*num_boxes)*(5+classes);
289  if (truth[index]) continue;
290  truth[index++] = 1;
291 
292  if (id < classes) truth[index+id] = 1;
293  index += classes;
294 
295  truth[index++] = x;
296  truth[index++] = y;
297  truth[index++] = w;
298  truth[index++] = h;
299  }
300  free(boxes);
301 }
302 
303 void load_rle(image im, int *rle, int n)
304 {
305  int count = 0;
306  int curr = 0;
307  int i,j;
308  for(i = 0; i < n; ++i){
309  for(j = 0; j < rle[i]; ++j){
310  im.data[count++] = curr;
311  }
312  curr = 1 - curr;
313  }
314  for(; count < im.h*im.w*im.c; ++count){
315  im.data[count] = curr;
316  }
317 }
318 
319 void or_image(image src, image dest, int c)
320 {
321  int i;
322  for(i = 0; i < src.w*src.h; ++i){
323  if(src.data[i]) dest.data[dest.w*dest.h*c + i] = 1;
324  }
325 }
326 
328 {
329  int k, j, i;
330  int s = src.w*src.h;
331  for(k = 0; k < src.c-1; ++k){
332  for(i = 0; i < s; ++i){
333  if (src.data[k*s + i]){
334  for(j = k+1; j < src.c; ++j){
335  src.data[j*s + i] = 0;
336  }
337  }
338  }
339  }
340 }
341 
343 {
344  int x,y;
345  int minx = im.w;
346  int miny = im.h;
347  int maxx = 0;
348  int maxy = 0;
349  for(y = 0; y < im.h; ++y){
350  for(x = 0; x < im.w; ++x){
351  if(im.data[y*im.w + x]){
352  minx = (x < minx) ? x : minx;
353  miny = (y < miny) ? y : miny;
354  maxx = (x > maxx) ? x : maxx;
355  maxy = (y > maxy) ? y : maxy;
356  }
357  }
358  }
359  box b = {minx, miny, maxx-minx + 1, maxy-miny + 1};
360  //printf("%f %f %f %f\n", b.x, b.y, b.w, b.h);
361  return b;
362 }
363 
364 void fill_truth_iseg(char *path, int num_boxes, float *truth, int classes, int w, int h, augment_args aug, int flip, int mw, int mh)
365 {
366  char labelpath[4096];
367  find_replace(path, "images", "mask", labelpath);
368  find_replace(labelpath, "JPEGImages", "mask", labelpath);
369  find_replace(labelpath, ".jpg", ".txt", labelpath);
370  find_replace(labelpath, ".JPG", ".txt", labelpath);
371  find_replace(labelpath, ".JPEG", ".txt", labelpath);
372  FILE *file = fopen(labelpath, "r");
373  if(!file) file_error(labelpath);
374  char buff[32788];
375  int id;
376  int i = 0;
377  int j;
378  image part = make_image(w, h, 1);
379  while((fscanf(file, "%d %s", &id, buff) == 2) && i < num_boxes){
380  int n = 0;
381  int *rle = read_intlist(buff, &n, 0);
382  load_rle(part, rle, n);
383  image sized = rotate_crop_image(part, aug.rad, aug.scale, aug.w, aug.h, aug.dx, aug.dy, aug.aspect);
384  if(flip) flip_image(sized);
385 
386  image mask = resize_image(sized, mw, mh);
387  truth[i*(mw*mh+1)] = id;
388  for(j = 0; j < mw*mh; ++j){
389  truth[i*(mw*mh + 1) + 1 + j] = mask.data[j];
390  }
391  ++i;
392 
393  free_image(mask);
394  free_image(sized);
395  free(rle);
396  }
397  if(i < num_boxes) truth[i*(mw*mh+1)] = -1;
398  fclose(file);
399  free_image(part);
400 }
401 
402 void fill_truth_mask(char *path, int num_boxes, float *truth, int classes, int w, int h, augment_args aug, int flip, int mw, int mh)
403 {
404  char labelpath[4096];
405  find_replace(path, "images", "mask", labelpath);
406  find_replace(labelpath, "JPEGImages", "mask", labelpath);
407  find_replace(labelpath, ".jpg", ".txt", labelpath);
408  find_replace(labelpath, ".JPG", ".txt", labelpath);
409  find_replace(labelpath, ".JPEG", ".txt", labelpath);
410  FILE *file = fopen(labelpath, "r");
411  if(!file) file_error(labelpath);
412  char buff[32788];
413  int id;
414  int i = 0;
415  image part = make_image(w, h, 1);
416  while((fscanf(file, "%d %s", &id, buff) == 2) && i < num_boxes){
417  int n = 0;
418  int *rle = read_intlist(buff, &n, 0);
419  load_rle(part, rle, n);
420  image sized = rotate_crop_image(part, aug.rad, aug.scale, aug.w, aug.h, aug.dx, aug.dy, aug.aspect);
421  if(flip) flip_image(sized);
422  box b = bound_image(sized);
423  if(b.w > 0){
424  image crop = crop_image(sized, b.x, b.y, b.w, b.h);
425  image mask = resize_image(crop, mw, mh);
426  truth[i*(4 + mw*mh + 1) + 0] = (b.x + b.w/2.)/sized.w;
427  truth[i*(4 + mw*mh + 1) + 1] = (b.y + b.h/2.)/sized.h;
428  truth[i*(4 + mw*mh + 1) + 2] = b.w/sized.w;
429  truth[i*(4 + mw*mh + 1) + 3] = b.h/sized.h;
430  int j;
431  for(j = 0; j < mw*mh; ++j){
432  truth[i*(4 + mw*mh + 1) + 4 + j] = mask.data[j];
433  }
434  truth[i*(4 + mw*mh + 1) + 4 + mw*mh] = id;
435  free_image(crop);
436  free_image(mask);
437  ++i;
438  }
439  free_image(sized);
440  free(rle);
441  }
442  fclose(file);
443  free_image(part);
444 }
445 
446 
447 void fill_truth_detection(char *path, int num_boxes, float *truth, int classes, int flip, float dx, float dy, float sx, float sy)
448 {
449  char labelpath[4096];
450  find_replace(path, "images", "labels", labelpath);
451  find_replace(labelpath, "JPEGImages", "labels", labelpath);
452 
453  find_replace(labelpath, "raw", "labels", labelpath);
454  find_replace(labelpath, ".jpg", ".txt", labelpath);
455  find_replace(labelpath, ".png", ".txt", labelpath);
456  find_replace(labelpath, ".JPG", ".txt", labelpath);
457  find_replace(labelpath, ".JPEG", ".txt", labelpath);
458  int count = 0;
459  box_label *boxes = read_boxes(labelpath, &count);
460  randomize_boxes(boxes, count);
461  correct_boxes(boxes, count, dx, dy, sx, sy, flip);
462  if(count > num_boxes) count = num_boxes;
463  float x,y,w,h;
464  int id;
465  int i;
466  int sub = 0;
467 
468  for (i = 0; i < count; ++i) {
469  x = boxes[i].x;
470  y = boxes[i].y;
471  w = boxes[i].w;
472  h = boxes[i].h;
473  id = boxes[i].id;
474 
475  if ((w < .001 || h < .001)) {
476  ++sub;
477  continue;
478  }
479 
480  truth[(i-sub)*5+0] = x;
481  truth[(i-sub)*5+1] = y;
482  truth[(i-sub)*5+2] = w;
483  truth[(i-sub)*5+3] = h;
484  truth[(i-sub)*5+4] = id;
485  }
486  free(boxes);
487 }
488 
489 #define NUMCHARS 37
490 
491 void print_letters(float *pred, int n)
492 {
493  int i;
494  for(i = 0; i < n; ++i){
495  int index = max_index(pred+i*NUMCHARS, NUMCHARS);
496  printf("%c", int_to_alphanum(index));
497  }
498  printf("\n");
499 }
500 
501 void fill_truth_captcha(char *path, int n, float *truth)
502 {
503  char *begin = strrchr(path, '/');
504  ++begin;
505  int i;
506  for(i = 0; i < strlen(begin) && i < n && begin[i] != '.'; ++i){
507  int index = alphanum_to_int(begin[i]);
508  if(index > 35) printf("Bad %c\n", begin[i]);
509  truth[i*NUMCHARS+index] = 1;
510  }
511  for(;i < n; ++i){
512  truth[i*NUMCHARS + NUMCHARS-1] = 1;
513  }
514 }
515 
516 data load_data_captcha(char **paths, int n, int m, int k, int w, int h)
517 {
518  if(m) paths = get_random_paths(paths, n, m);
519  data d = {0};
520  d.shallow = 0;
521  d.X = load_image_paths(paths, n, w, h);
522  d.y = make_matrix(n, k*NUMCHARS);
523  int i;
524  for(i = 0; i < n; ++i){
525  fill_truth_captcha(paths[i], k, d.y.vals[i]);
526  }
527  if(m) free(paths);
528  return d;
529 }
530 
531 data load_data_captcha_encode(char **paths, int n, int m, int w, int h)
532 {
533  if(m) paths = get_random_paths(paths, n, m);
534  data d = {0};
535  d.shallow = 0;
536  d.X = load_image_paths(paths, n, w, h);
537  d.X.cols = 17100;
538  d.y = d.X;
539  if(m) free(paths);
540  return d;
541 }
542 
543 void fill_truth(char *path, char **labels, int k, float *truth)
544 {
545  int i;
546  memset(truth, 0, k*sizeof(float));
547  int count = 0;
548  for(i = 0; i < k; ++i){
549  if(strstr(path, labels[i])){
550  truth[i] = 1;
551  ++count;
552  //printf("%s %s %d\n", path, labels[i], i);
553  }
554  }
555  if(count != 1 && (k != 1 || count != 0)) printf("Too many or too few labels: %d, %s\n", count, path);
556 }
557 
558 void fill_hierarchy(float *truth, int k, tree *hierarchy)
559 {
560  int j;
561  for(j = 0; j < k; ++j){
562  if(truth[j]){
563  int parent = hierarchy->parent[j];
564  while(parent >= 0){
565  truth[parent] = 1;
566  parent = hierarchy->parent[parent];
567  }
568  }
569  }
570  int i;
571  int count = 0;
572  for(j = 0; j < hierarchy->groups; ++j){
573  //printf("%d\n", count);
574  int mask = 1;
575  for(i = 0; i < hierarchy->group_size[j]; ++i){
576  if(truth[count + i]){
577  mask = 0;
578  break;
579  }
580  }
581  if (mask) {
582  for(i = 0; i < hierarchy->group_size[j]; ++i){
583  truth[count + i] = SECRET_NUM;
584  }
585  }
586  count += hierarchy->group_size[j];
587  }
588 }
589 
590 matrix load_regression_labels_paths(char **paths, int n, int k)
591 {
592  matrix y = make_matrix(n, k);
593  int i,j;
594  for(i = 0; i < n; ++i){
595  char labelpath[4096];
596  find_replace(paths[i], "images", "labels", labelpath);
597  find_replace(labelpath, "JPEGImages", "labels", labelpath);
598  find_replace(labelpath, ".BMP", ".txt", labelpath);
599  find_replace(labelpath, ".JPEG", ".txt", labelpath);
600  find_replace(labelpath, ".JPG", ".txt", labelpath);
601  find_replace(labelpath, ".JPeG", ".txt", labelpath);
602  find_replace(labelpath, ".Jpeg", ".txt", labelpath);
603  find_replace(labelpath, ".PNG", ".txt", labelpath);
604  find_replace(labelpath, ".TIF", ".txt", labelpath);
605  find_replace(labelpath, ".bmp", ".txt", labelpath);
606  find_replace(labelpath, ".jpeg", ".txt", labelpath);
607  find_replace(labelpath, ".jpg", ".txt", labelpath);
608  find_replace(labelpath, ".png", ".txt", labelpath);
609  find_replace(labelpath, ".tif", ".txt", labelpath);
610 
611  FILE *file = fopen(labelpath, "r");
612  for(j = 0; j < k; ++j){
613  fscanf(file, "%f", &(y.vals[i][j]));
614  }
615  fclose(file);
616  }
617  return y;
618 }
619 
620 matrix load_labels_paths(char **paths, int n, char **labels, int k, tree *hierarchy)
621 {
622  matrix y = make_matrix(n, k);
623  int i;
624  for(i = 0; i < n && labels; ++i){
625  fill_truth(paths[i], labels, k, y.vals[i]);
626  if(hierarchy){
627  fill_hierarchy(y.vals[i], k, hierarchy);
628  }
629  }
630  return y;
631 }
632 
633 matrix load_tags_paths(char **paths, int n, int k)
634 {
635  matrix y = make_matrix(n, k);
636  int i;
637  //int count = 0;
638  for(i = 0; i < n; ++i){
639  char label[4096];
640  find_replace(paths[i], "images", "labels", label);
641  find_replace(label, ".jpg", ".txt", label);
642  FILE *file = fopen(label, "r");
643  if (!file) continue;
644  //++count;
645  int tag;
646  while(fscanf(file, "%d", &tag) == 1){
647  if(tag < k){
648  y.vals[i][tag] = 1;
649  }
650  }
651  fclose(file);
652  }
653  //printf("%d/%d\n", count, n);
654  return y;
655 }
656 
657 char **get_labels(char *filename)
658 {
659  list *plist = get_paths(filename);
660  char **labels = (char **)list_to_array(plist);
661  free_list(plist);
662  return labels;
663 }
664 
666 {
667  if(!d.shallow){
668  free_matrix(d.X);
669  free_matrix(d.y);
670  }else{
671  free(d.X.vals);
672  free(d.y.vals);
673  }
674 }
675 
676 image get_segmentation_image(char *path, int w, int h, int classes)
677 {
678  char labelpath[4096];
679  find_replace(path, "images", "mask", labelpath);
680  find_replace(labelpath, "JPEGImages", "mask", labelpath);
681  find_replace(labelpath, ".jpg", ".txt", labelpath);
682  find_replace(labelpath, ".JPG", ".txt", labelpath);
683  find_replace(labelpath, ".JPEG", ".txt", labelpath);
684  image mask = make_image(w, h, classes);
685  FILE *file = fopen(labelpath, "r");
686  if(!file) file_error(labelpath);
687  char buff[32788];
688  int id;
689  image part = make_image(w, h, 1);
690  while(fscanf(file, "%d %s", &id, buff) == 2){
691  int n = 0;
692  int *rle = read_intlist(buff, &n, 0);
693  load_rle(part, rle, n);
694  or_image(part, mask, id);
695  free(rle);
696  }
697  //exclusive_image(mask);
698  fclose(file);
699  free_image(part);
700  return mask;
701 }
702 
703 image get_segmentation_image2(char *path, int w, int h, int classes)
704 {
705  char labelpath[4096];
706  find_replace(path, "images", "mask", labelpath);
707  find_replace(labelpath, "JPEGImages", "mask", labelpath);
708  find_replace(labelpath, ".jpg", ".txt", labelpath);
709  find_replace(labelpath, ".JPG", ".txt", labelpath);
710  find_replace(labelpath, ".JPEG", ".txt", labelpath);
711  image mask = make_image(w, h, classes+1);
712  int i;
713  for(i = 0; i < w*h; ++i){
714  mask.data[w*h*classes + i] = 1;
715  }
716  FILE *file = fopen(labelpath, "r");
717  if(!file) file_error(labelpath);
718  char buff[32788];
719  int id;
720  image part = make_image(w, h, 1);
721  while(fscanf(file, "%d %s", &id, buff) == 2){
722  int n = 0;
723  int *rle = read_intlist(buff, &n, 0);
724  load_rle(part, rle, n);
725  or_image(part, mask, id);
726  for(i = 0; i < w*h; ++i){
727  if(part.data[i]) mask.data[w*h*classes + i] = 0;
728  }
729  free(rle);
730  }
731  //exclusive_image(mask);
732  fclose(file);
733  free_image(part);
734  return mask;
735 }
736 
737 data load_data_seg(int n, char **paths, int m, int w, int h, int classes, int min, int max, float angle, float aspect, float hue, float saturation, float exposure, int div)
738 {
739  char **random_paths = get_random_paths(paths, n, m);
740  int i;
741  data d = {0};
742  d.shallow = 0;
743 
744  d.X.rows = n;
745  d.X.vals = calloc(d.X.rows, sizeof(float*));
746  d.X.cols = h*w*3;
747 
748 
749  d.y.rows = n;
750  d.y.cols = h*w*classes/div/div;
751  d.y.vals = calloc(d.X.rows, sizeof(float*));
752 
753  for(i = 0; i < n; ++i){
754  image orig = load_image_color(random_paths[i], 0, 0);
755  augment_args a = random_augment_args(orig, angle, aspect, min, max, w, h);
756  image sized = rotate_crop_image(orig, a.rad, a.scale, a.w, a.h, a.dx, a.dy, a.aspect);
757 
758  int flip = rand()%2;
759  if(flip) flip_image(sized);
760  random_distort_image(sized, hue, saturation, exposure);
761  d.X.vals[i] = sized.data;
762 
763  image mask = get_segmentation_image(random_paths[i], orig.w, orig.h, classes);
764  //image mask = make_image(orig.w, orig.h, classes+1);
765  image sized_m = rotate_crop_image(mask, a.rad, a.scale/div, a.w/div, a.h/div, a.dx/div, a.dy/div, a.aspect);
766 
767  if(flip) flip_image(sized_m);
768  d.y.vals[i] = sized_m.data;
769 
770  free_image(orig);
771  free_image(mask);
772 
773  /*
774  image rgb = mask_to_rgb(sized_m, classes);
775  show_image(rgb, "part");
776  show_image(sized, "orig");
777  cvWaitKey(0);
778  free_image(rgb);
779  */
780  }
781  free(random_paths);
782  return d;
783 }
784 
785 data load_data_iseg(int n, char **paths, int m, int w, int h, int classes, int boxes, int div, int min, int max, float angle, float aspect, float hue, float saturation, float exposure)
786 {
787  char **random_paths = get_random_paths(paths, n, m);
788  int i;
789  data d = {0};
790  d.shallow = 0;
791 
792  d.X.rows = n;
793  d.X.vals = calloc(d.X.rows, sizeof(float*));
794  d.X.cols = h*w*3;
795 
796  d.y = make_matrix(n, (((w/div)*(h/div))+1)*boxes);
797 
798  for(i = 0; i < n; ++i){
799  image orig = load_image_color(random_paths[i], 0, 0);
800  augment_args a = random_augment_args(orig, angle, aspect, min, max, w, h);
801  image sized = rotate_crop_image(orig, a.rad, a.scale, a.w, a.h, a.dx, a.dy, a.aspect);
802 
803  int flip = rand()%2;
804  if(flip) flip_image(sized);
805  random_distort_image(sized, hue, saturation, exposure);
806  d.X.vals[i] = sized.data;
807  //show_image(sized, "image");
808 
809  fill_truth_iseg(random_paths[i], boxes, d.y.vals[i], classes, orig.w, orig.h, a, flip, w/div, h/div);
810 
811  free_image(orig);
812 
813  /*
814  image rgb = mask_to_rgb(sized_m, classes);
815  show_image(rgb, "part");
816  show_image(sized, "orig");
817  cvWaitKey(0);
818  free_image(rgb);
819  */
820  }
821  free(random_paths);
822  return d;
823 }
824 
825 data load_data_mask(int n, char **paths, int m, int w, int h, int classes, int boxes, int coords, int min, int max, float angle, float aspect, float hue, float saturation, float exposure)
826 {
827  char **random_paths = get_random_paths(paths, n, m);
828  int i;
829  data d = {0};
830  d.shallow = 0;
831 
832  d.X.rows = n;
833  d.X.vals = calloc(d.X.rows, sizeof(float*));
834  d.X.cols = h*w*3;
835 
836  d.y = make_matrix(n, (coords+1)*boxes);
837 
838  for(i = 0; i < n; ++i){
839  image orig = load_image_color(random_paths[i], 0, 0);
840  augment_args a = random_augment_args(orig, angle, aspect, min, max, w, h);
841  image sized = rotate_crop_image(orig, a.rad, a.scale, a.w, a.h, a.dx, a.dy, a.aspect);
842 
843  int flip = rand()%2;
844  if(flip) flip_image(sized);
845  random_distort_image(sized, hue, saturation, exposure);
846  d.X.vals[i] = sized.data;
847  //show_image(sized, "image");
848 
849  fill_truth_mask(random_paths[i], boxes, d.y.vals[i], classes, orig.w, orig.h, a, flip, 14, 14);
850 
851  free_image(orig);
852 
853  /*
854  image rgb = mask_to_rgb(sized_m, classes);
855  show_image(rgb, "part");
856  show_image(sized, "orig");
857  cvWaitKey(0);
858  free_image(rgb);
859  */
860  }
861  free(random_paths);
862  return d;
863 }
864 
865 data load_data_region(int n, char **paths, int m, int w, int h, int size, int classes, float jitter, float hue, float saturation, float exposure)
866 {
867  char **random_paths = get_random_paths(paths, n, m);
868  int i;
869  data d = {0};
870  d.shallow = 0;
871 
872  d.X.rows = n;
873  d.X.vals = calloc(d.X.rows, sizeof(float*));
874  d.X.cols = h*w*3;
875 
876 
877  int k = size*size*(5+classes);
878  d.y = make_matrix(n, k);
879  for(i = 0; i < n; ++i){
880  image orig = load_image_color(random_paths[i], 0, 0);
881 
882  int oh = orig.h;
883  int ow = orig.w;
884 
885  int dw = (ow*jitter);
886  int dh = (oh*jitter);
887 
888  int pleft = rand_uniform(-dw, dw);
889  int pright = rand_uniform(-dw, dw);
890  int ptop = rand_uniform(-dh, dh);
891  int pbot = rand_uniform(-dh, dh);
892 
893  int swidth = ow - pleft - pright;
894  int sheight = oh - ptop - pbot;
895 
896  float sx = (float)swidth / ow;
897  float sy = (float)sheight / oh;
898 
899  int flip = rand()%2;
900  image cropped = crop_image(orig, pleft, ptop, swidth, sheight);
901 
902  float dx = ((float)pleft/ow)/sx;
903  float dy = ((float)ptop /oh)/sy;
904 
905  image sized = resize_image(cropped, w, h);
906  if(flip) flip_image(sized);
907  random_distort_image(sized, hue, saturation, exposure);
908  d.X.vals[i] = sized.data;
909 
910  fill_truth_region(random_paths[i], d.y.vals[i], classes, size, flip, dx, dy, 1./sx, 1./sy);
911 
912  free_image(orig);
913  free_image(cropped);
914  }
915  free(random_paths);
916  return d;
917 }
918 
919 data load_data_compare(int n, char **paths, int m, int classes, int w, int h)
920 {
921  if(m) paths = get_random_paths(paths, 2*n, m);
922  int i,j;
923  data d = {0};
924  d.shallow = 0;
925 
926  d.X.rows = n;
927  d.X.vals = calloc(d.X.rows, sizeof(float*));
928  d.X.cols = h*w*6;
929 
930  int k = 2*(classes);
931  d.y = make_matrix(n, k);
932  for(i = 0; i < n; ++i){
933  image im1 = load_image_color(paths[i*2], w, h);
934  image im2 = load_image_color(paths[i*2+1], w, h);
935 
936  d.X.vals[i] = calloc(d.X.cols, sizeof(float));
937  memcpy(d.X.vals[i], im1.data, h*w*3*sizeof(float));
938  memcpy(d.X.vals[i] + h*w*3, im2.data, h*w*3*sizeof(float));
939 
940  int id;
941  float iou;
942 
943  char imlabel1[4096];
944  char imlabel2[4096];
945  find_replace(paths[i*2], "imgs", "labels", imlabel1);
946  find_replace(imlabel1, "jpg", "txt", imlabel1);
947  FILE *fp1 = fopen(imlabel1, "r");
948 
949  while(fscanf(fp1, "%d %f", &id, &iou) == 2){
950  if (d.y.vals[i][2*id] < iou) d.y.vals[i][2*id] = iou;
951  }
952 
953  find_replace(paths[i*2+1], "imgs", "labels", imlabel2);
954  find_replace(imlabel2, "jpg", "txt", imlabel2);
955  FILE *fp2 = fopen(imlabel2, "r");
956 
957  while(fscanf(fp2, "%d %f", &id, &iou) == 2){
958  if (d.y.vals[i][2*id + 1] < iou) d.y.vals[i][2*id + 1] = iou;
959  }
960 
961  for (j = 0; j < classes; ++j){
962  if (d.y.vals[i][2*j] > .5 && d.y.vals[i][2*j+1] < .5){
963  d.y.vals[i][2*j] = 1;
964  d.y.vals[i][2*j+1] = 0;
965  } else if (d.y.vals[i][2*j] < .5 && d.y.vals[i][2*j+1] > .5){
966  d.y.vals[i][2*j] = 0;
967  d.y.vals[i][2*j+1] = 1;
968  } else {
969  d.y.vals[i][2*j] = SECRET_NUM;
970  d.y.vals[i][2*j+1] = SECRET_NUM;
971  }
972  }
973  fclose(fp1);
974  fclose(fp2);
975 
976  free_image(im1);
977  free_image(im2);
978  }
979  if(m) free(paths);
980  return d;
981 }
982 
983 data load_data_swag(char **paths, int n, int classes, float jitter)
984 {
985  int index = rand()%n;
986  char *random_path = paths[index];
987 
988  image orig = load_image_color(random_path, 0, 0);
989  int h = orig.h;
990  int w = orig.w;
991 
992  data d = {0};
993  d.shallow = 0;
994  d.w = w;
995  d.h = h;
996 
997  d.X.rows = 1;
998  d.X.vals = calloc(d.X.rows, sizeof(float*));
999  d.X.cols = h*w*3;
1000 
1001  int k = (4+classes)*90;
1002  d.y = make_matrix(1, k);
1003 
1004  int dw = w*jitter;
1005  int dh = h*jitter;
1006 
1007  int pleft = rand_uniform(-dw, dw);
1008  int pright = rand_uniform(-dw, dw);
1009  int ptop = rand_uniform(-dh, dh);
1010  int pbot = rand_uniform(-dh, dh);
1011 
1012  int swidth = w - pleft - pright;
1013  int sheight = h - ptop - pbot;
1014 
1015  float sx = (float)swidth / w;
1016  float sy = (float)sheight / h;
1017 
1018  int flip = rand()%2;
1019  image cropped = crop_image(orig, pleft, ptop, swidth, sheight);
1020 
1021  float dx = ((float)pleft/w)/sx;
1022  float dy = ((float)ptop /h)/sy;
1023 
1024  image sized = resize_image(cropped, w, h);
1025  if(flip) flip_image(sized);
1026  d.X.vals[0] = sized.data;
1027 
1028  fill_truth_swag(random_path, d.y.vals[0], classes, flip, dx, dy, 1./sx, 1./sy);
1029 
1030  free_image(orig);
1031  free_image(cropped);
1032 
1033  return d;
1034 }
1035 
1036 data load_data_detection(int n, char **paths, int m, int w, int h, int boxes, int classes, float jitter, float hue, float saturation, float exposure)
1037 {
1038  char **random_paths = get_random_paths(paths, n, m);
1039  int i;
1040  data d = {0};
1041  d.shallow = 0;
1042 
1043  d.X.rows = n;
1044  d.X.vals = calloc(d.X.rows, sizeof(float*));
1045  d.X.cols = h*w*3;
1046 
1047  d.y = make_matrix(n, 5*boxes);
1048  for(i = 0; i < n; ++i){
1049  image orig = load_image_color(random_paths[i], 0, 0);
1050  image sized = make_image(w, h, orig.c);
1051  fill_image(sized, .5);
1052 
1053  float dw = jitter * orig.w;
1054  float dh = jitter * orig.h;
1055 
1056  float new_ar = (orig.w + rand_uniform(-dw, dw)) / (orig.h + rand_uniform(-dh, dh));
1057  //float scale = rand_uniform(.25, 2);
1058  float scale = 1;
1059 
1060  float nw, nh;
1061 
1062  if(new_ar < 1){
1063  nh = scale * h;
1064  nw = nh * new_ar;
1065  } else {
1066  nw = scale * w;
1067  nh = nw / new_ar;
1068  }
1069 
1070  float dx = rand_uniform(0, w - nw);
1071  float dy = rand_uniform(0, h - nh);
1072 
1073  place_image(orig, nw, nh, dx, dy, sized);
1074 
1075  random_distort_image(sized, hue, saturation, exposure);
1076 
1077  int flip = rand()%2;
1078  if(flip) flip_image(sized);
1079  d.X.vals[i] = sized.data;
1080 
1081 
1082  fill_truth_detection(random_paths[i], boxes, d.y.vals[i], classes, flip, -dx/w, -dy/h, nw/w, nh/h);
1083 
1084  free_image(orig);
1085  }
1086  free(random_paths);
1087  return d;
1088 }
1089 
1090 void *load_thread(void *ptr)
1091 {
1092  //printf("Loading data: %d\n", rand());
1093  load_args a = *(struct load_args*)ptr;
1094  if(a.exposure == 0) a.exposure = 1;
1095  if(a.saturation == 0) a.saturation = 1;
1096  if(a.aspect == 0) a.aspect = 1;
1097 
1098  if (a.type == OLD_CLASSIFICATION_DATA){
1099  *a.d = load_data_old(a.paths, a.n, a.m, a.labels, a.classes, a.w, a.h);
1100  } else if (a.type == REGRESSION_DATA){
1101  *a.d = load_data_regression(a.paths, a.n, a.m, a.classes, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure);
1102  } else if (a.type == CLASSIFICATION_DATA){
1103  *a.d = load_data_augment(a.paths, a.n, a.m, a.labels, a.classes, a.hierarchy, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure, a.center);
1104  } else if (a.type == SUPER_DATA){
1105  *a.d = load_data_super(a.paths, a.n, a.m, a.w, a.h, a.scale);
1106  } else if (a.type == WRITING_DATA){
1107  *a.d = load_data_writing(a.paths, a.n, a.m, a.w, a.h, a.out_w, a.out_h);
1108  } else if (a.type == ISEG_DATA){
1109  *a.d = load_data_iseg(a.n, a.paths, a.m, a.w, a.h, a.classes, a.num_boxes, a.scale, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure);
1110  } else if (a.type == INSTANCE_DATA){
1111  *a.d = load_data_mask(a.n, a.paths, a.m, a.w, a.h, a.classes, a.num_boxes, a.coords, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure);
1112  } else if (a.type == SEGMENTATION_DATA){
1113  *a.d = load_data_seg(a.n, a.paths, a.m, a.w, a.h, a.classes, a.min, a.max, a.angle, a.aspect, a.hue, a.saturation, a.exposure, a.scale);
1114  } else if (a.type == REGION_DATA){
1115  *a.d = load_data_region(a.n, a.paths, a.m, a.w, a.h, a.num_boxes, a.classes, a.jitter, a.hue, a.saturation, a.exposure);
1116  } else if (a.type == DETECTION_DATA){
1117  *a.d = load_data_detection(a.n, a.paths, a.m, a.w, a.h, a.num_boxes, a.classes, a.jitter, a.hue, a.saturation, a.exposure);
1118  } else if (a.type == SWAG_DATA){
1119  *a.d = load_data_swag(a.paths, a.n, a.classes, a.jitter);
1120  } else if (a.type == COMPARE_DATA){
1121  *a.d = load_data_compare(a.n, a.paths, a.m, a.classes, a.w, a.h);
1122  } else if (a.type == IMAGE_DATA){
1123  *(a.im) = load_image_color(a.path, 0, 0);
1124  *(a.resized) = resize_image(*(a.im), a.w, a.h);
1125  } else if (a.type == LETTERBOX_DATA){
1126  *(a.im) = load_image_color(a.path, 0, 0);
1127  *(a.resized) = letterbox_image(*(a.im), a.w, a.h);
1128  } else if (a.type == TAG_DATA){
1129  *a.d = load_data_tag(a.paths, a.n, a.m, a.classes, a.min, a.max, a.size, a.angle, a.aspect, a.hue, a.saturation, a.exposure);
1130  }
1131  free(ptr);
1132  return 0;
1133 }
1134 
1136 {
1137  pthread_t thread;
1138  struct load_args *ptr = calloc(1, sizeof(struct load_args));
1139  *ptr = args;
1140  if(pthread_create(&thread, 0, load_thread, ptr)) error("Thread creation failed");
1141  return thread;
1142 }
1143 
1144 void *load_threads(void *ptr)
1145 {
1146  int i;
1147  load_args args = *(load_args *)ptr;
1148  if (args.threads == 0) args.threads = 1;
1149  data *out = args.d;
1150  int total = args.n;
1151  free(ptr);
1152  data *buffers = calloc(args.threads, sizeof(data));
1153  pthread_t *threads = calloc(args.threads, sizeof(pthread_t));
1154  for(i = 0; i < args.threads; ++i){
1155  args.d = buffers + i;
1156  args.n = (i+1) * total/args.threads - i * total/args.threads;
1157  threads[i] = load_data_in_thread(args);
1158  }
1159  for(i = 0; i < args.threads; ++i){
1160  pthread_join(threads[i], 0);
1161  }
1162  *out = concat_datas(buffers, args.threads);
1163  out->shallow = 0;
1164  for(i = 0; i < args.threads; ++i){
1165  buffers[i].shallow = 1;
1166  free_data(buffers[i]);
1167  }
1168  free(buffers);
1169  free(threads);
1170  return 0;
1171 }
1172 
1174 {
1175  struct load_args *ptr = calloc(1, sizeof(struct load_args));
1176  *ptr = args;
1177  load_thread(ptr);
1178 }
1179 
1180 pthread_t load_data(load_args args)
1181 {
1182  pthread_t thread;
1183  struct load_args *ptr = calloc(1, sizeof(struct load_args));
1184  *ptr = args;
1185  if(pthread_create(&thread, 0, load_threads, ptr)) error("Thread creation failed");
1186  return thread;
1187 }
1188 
1189 data load_data_writing(char **paths, int n, int m, int w, int h, int out_w, int out_h)
1190 {
1191  if(m) paths = get_random_paths(paths, n, m);
1192  char **replace_paths = find_replace_paths(paths, n, ".png", "-label.png");
1193  data d = {0};
1194  d.shallow = 0;
1195  d.X = load_image_paths(paths, n, w, h);
1196  d.y = load_image_paths_gray(replace_paths, n, out_w, out_h);
1197  if(m) free(paths);
1198  int i;
1199  for(i = 0; i < n; ++i) free(replace_paths[i]);
1200  free(replace_paths);
1201  return d;
1202 }
1203 
1204 data load_data_old(char **paths, int n, int m, char **labels, int k, int w, int h)
1205 {
1206  if(m) paths = get_random_paths(paths, n, m);
1207  data d = {0};
1208  d.shallow = 0;
1209  d.X = load_image_paths(paths, n, w, h);
1210  d.y = load_labels_paths(paths, n, labels, k, 0);
1211  if(m) free(paths);
1212  return d;
1213 }
1214 
1215 /*
1216  data load_data_study(char **paths, int n, int m, char **labels, int k, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure)
1217  {
1218  data d = {0};
1219  d.indexes = calloc(n, sizeof(int));
1220  if(m) paths = get_random_paths_indexes(paths, n, m, d.indexes);
1221  d.shallow = 0;
1222  d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure);
1223  d.y = load_labels_paths(paths, n, labels, k);
1224  if(m) free(paths);
1225  return d;
1226  }
1227  */
1228 
1229 data load_data_super(char **paths, int n, int m, int w, int h, int scale)
1230 {
1231  if(m) paths = get_random_paths(paths, n, m);
1232  data d = {0};
1233  d.shallow = 0;
1234 
1235  int i;
1236  d.X.rows = n;
1237  d.X.vals = calloc(n, sizeof(float*));
1238  d.X.cols = w*h*3;
1239 
1240  d.y.rows = n;
1241  d.y.vals = calloc(n, sizeof(float*));
1242  d.y.cols = w*scale * h*scale * 3;
1243 
1244  for(i = 0; i < n; ++i){
1245  image im = load_image_color(paths[i], 0, 0);
1246  image crop = random_crop_image(im, w*scale, h*scale);
1247  int flip = rand()%2;
1248  if (flip) flip_image(crop);
1249  image resize = resize_image(crop, w, h);
1250  d.X.vals[i] = resize.data;
1251  d.y.vals[i] = crop.data;
1252  free_image(im);
1253  }
1254 
1255  if(m) free(paths);
1256  return d;
1257 }
1258 
1259 data load_data_regression(char **paths, int n, int m, int k, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure)
1260 {
1261  if(m) paths = get_random_paths(paths, n, m);
1262  data d = {0};
1263  d.shallow = 0;
1264  d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure, 0);
1265  d.y = load_regression_labels_paths(paths, n, k);
1266  if(m) free(paths);
1267  return d;
1268 }
1269 
1270 data select_data(data *orig, int *inds)
1271 {
1272  data d = {0};
1273  d.shallow = 1;
1274  d.w = orig[0].w;
1275  d.h = orig[0].h;
1276 
1277  d.X.rows = orig[0].X.rows;
1278  d.y.rows = orig[0].X.rows;
1279 
1280  d.X.cols = orig[0].X.cols;
1281  d.y.cols = orig[0].y.cols;
1282 
1283  d.X.vals = calloc(orig[0].X.rows, sizeof(float *));
1284  d.y.vals = calloc(orig[0].y.rows, sizeof(float *));
1285  int i;
1286  for(i = 0; i < d.X.rows; ++i){
1287  d.X.vals[i] = orig[inds[i]].X.vals[i];
1288  d.y.vals[i] = orig[inds[i]].y.vals[i];
1289  }
1290  return d;
1291 }
1292 
1293 data *tile_data(data orig, int divs, int size)
1294 {
1295  data *ds = calloc(divs*divs, sizeof(data));
1296  int i, j;
1297 #pragma omp parallel for
1298  for(i = 0; i < divs*divs; ++i){
1299  data d;
1300  d.shallow = 0;
1301  d.w = orig.w/divs * size;
1302  d.h = orig.h/divs * size;
1303  d.X.rows = orig.X.rows;
1304  d.X.cols = d.w*d.h*3;
1305  d.X.vals = calloc(d.X.rows, sizeof(float*));
1306 
1307  d.y = copy_matrix(orig.y);
1308 #pragma omp parallel for
1309  for(j = 0; j < orig.X.rows; ++j){
1310  int x = (i%divs) * orig.w / divs - (d.w - orig.w/divs)/2;
1311  int y = (i/divs) * orig.h / divs - (d.h - orig.h/divs)/2;
1312  image im = float_to_image(orig.w, orig.h, 3, orig.X.vals[j]);
1313  d.X.vals[j] = crop_image(im, x, y, d.w, d.h).data;
1314  }
1315  ds[i] = d;
1316  }
1317  return ds;
1318 }
1319 
1320 data resize_data(data orig, int w, int h)
1321 {
1322  data d = {0};
1323  d.shallow = 0;
1324  d.w = w;
1325  d.h = h;
1326  int i;
1327  d.X.rows = orig.X.rows;
1328  d.X.cols = w*h*3;
1329  d.X.vals = calloc(d.X.rows, sizeof(float*));
1330 
1331  d.y = copy_matrix(orig.y);
1332 #pragma omp parallel for
1333  for(i = 0; i < orig.X.rows; ++i){
1334  image im = float_to_image(orig.w, orig.h, 3, orig.X.vals[i]);
1335  d.X.vals[i] = resize_image(im, w, h).data;
1336  }
1337  return d;
1338 }
1339 
1340 data load_data_augment(char **paths, int n, int m, char **labels, int k, tree *hierarchy, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center)
1341 {
1342  if(m) paths = get_random_paths(paths, n, m);
1343  data d = {0};
1344  d.shallow = 0;
1345  d.w=size;
1346  d.h=size;
1347  d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure, center);
1348  d.y = load_labels_paths(paths, n, labels, k, hierarchy);
1349  if(m) free(paths);
1350  return d;
1351 }
1352 
1353 data load_data_tag(char **paths, int n, int m, int k, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure)
1354 {
1355  if(m) paths = get_random_paths(paths, n, m);
1356  data d = {0};
1357  d.w = size;
1358  d.h = size;
1359  d.shallow = 0;
1360  d.X = load_image_augment_paths(paths, n, min, max, size, angle, aspect, hue, saturation, exposure, 0);
1361  d.y = load_tags_paths(paths, n, k);
1362  if(m) free(paths);
1363  return d;
1364 }
1365 
1367 {
1368  int i, count = 0;
1369  matrix m;
1370  m.cols = m1.cols;
1371  m.rows = m1.rows+m2.rows;
1372  m.vals = calloc(m1.rows + m2.rows, sizeof(float*));
1373  for(i = 0; i < m1.rows; ++i){
1374  m.vals[count++] = m1.vals[i];
1375  }
1376  for(i = 0; i < m2.rows; ++i){
1377  m.vals[count++] = m2.vals[i];
1378  }
1379  return m;
1380 }
1381 
1383 {
1384  data d = {0};
1385  d.shallow = 1;
1386  d.X = concat_matrix(d1.X, d2.X);
1387  d.y = concat_matrix(d1.y, d2.y);
1388  d.w = d1.w;
1389  d.h = d1.h;
1390  return d;
1391 }
1392 
1394 {
1395  int i;
1396  data out = {0};
1397  for(i = 0; i < n; ++i){
1398  data new = concat_data(d[i], out);
1399  free_data(out);
1400  out = new;
1401  }
1402  return out;
1403 }
1404 
1405 data load_categorical_data_csv(char *filename, int target, int k)
1406 {
1407  data d = {0};
1408  d.shallow = 0;
1409  matrix X = csv_to_matrix(filename);
1410  float *truth_1d = pop_column(&X, target);
1411  float **truth = one_hot_encode(truth_1d, X.rows, k);
1412  matrix y;
1413  y.rows = X.rows;
1414  y.cols = k;
1415  y.vals = truth;
1416  d.X = X;
1417  d.y = y;
1418  free(truth_1d);
1419  return d;
1420 }
1421 
1422 data load_cifar10_data(char *filename)
1423 {
1424  data d = {0};
1425  d.shallow = 0;
1426  long i,j;
1427  matrix X = make_matrix(10000, 3072);
1428  matrix y = make_matrix(10000, 10);
1429  d.X = X;
1430  d.y = y;
1431 
1432  FILE *fp = fopen(filename, "rb");
1433  if(!fp) file_error(filename);
1434  for(i = 0; i < 10000; ++i){
1435  unsigned char bytes[3073];
1436  fread(bytes, 1, 3073, fp);
1437  int class = bytes[0];
1438  y.vals[i][class] = 1;
1439  for(j = 0; j < X.cols; ++j){
1440  X.vals[i][j] = (double)bytes[j+1];
1441  }
1442  }
1443  scale_data_rows(d, 1./255);
1444  //normalize_data_rows(d);
1445  fclose(fp);
1446  return d;
1447 }
1448 
1449 void get_random_batch(data d, int n, float *X, float *y)
1450 {
1451  int j;
1452  for(j = 0; j < n; ++j){
1453  int index = rand()%d.X.rows;
1454  memcpy(X+j*d.X.cols, d.X.vals[index], d.X.cols*sizeof(float));
1455  memcpy(y+j*d.y.cols, d.y.vals[index], d.y.cols*sizeof(float));
1456  }
1457 }
1458 
1459 void get_next_batch(data d, int n, int offset, float *X, float *y)
1460 {
1461  int j;
1462  for(j = 0; j < n; ++j){
1463  int index = offset + j;
1464  memcpy(X+j*d.X.cols, d.X.vals[index], d.X.cols*sizeof(float));
1465  if(y) memcpy(y+j*d.y.cols, d.y.vals[index], d.y.cols*sizeof(float));
1466  }
1467 }
1468 
1470 {
1471  int i, j;
1472  float scale = 1. / d.y.cols;
1473  float eps = .1;
1474  for(i = 0; i < d.y.rows; ++i){
1475  for(j = 0; j < d.y.cols; ++j){
1476  d.y.vals[i][j] = eps * scale + (1-eps) * d.y.vals[i][j];
1477  }
1478  }
1479 }
1480 
1482 {
1483  data d = {0};
1484  d.shallow = 0;
1485  int i,j,b;
1486  matrix X = make_matrix(50000, 3072);
1487  matrix y = make_matrix(50000, 10);
1488  d.X = X;
1489  d.y = y;
1490 
1491 
1492  for(b = 0; b < 5; ++b){
1493  char buff[256];
1494  sprintf(buff, "data/cifar/cifar-10-batches-bin/data_batch_%d.bin", b+1);
1495  FILE *fp = fopen(buff, "rb");
1496  if(!fp) file_error(buff);
1497  for(i = 0; i < 10000; ++i){
1498  unsigned char bytes[3073];
1499  fread(bytes, 1, 3073, fp);
1500  int class = bytes[0];
1501  y.vals[i+b*10000][class] = 1;
1502  for(j = 0; j < X.cols; ++j){
1503  X.vals[i+b*10000][j] = (double)bytes[j+1];
1504  }
1505  }
1506  fclose(fp);
1507  }
1508  //normalize_data_rows(d);
1509  scale_data_rows(d, 1./255);
1510  smooth_data(d);
1511  return d;
1512 }
1513 
1514 data load_go(char *filename)
1515 {
1516  FILE *fp = fopen(filename, "rb");
1517  matrix X = make_matrix(3363059, 361);
1518  matrix y = make_matrix(3363059, 361);
1519  int row, col;
1520 
1521  if(!fp) file_error(filename);
1522  char *label;
1523  int count = 0;
1524  while((label = fgetl(fp))){
1525  int i;
1526  if(count == X.rows){
1527  X = resize_matrix(X, count*2);
1528  y = resize_matrix(y, count*2);
1529  }
1530  sscanf(label, "%d %d", &row, &col);
1531  char *board = fgetl(fp);
1532 
1533  int index = row*19 + col;
1534  y.vals[count][index] = 1;
1535 
1536  for(i = 0; i < 19*19; ++i){
1537  float val = 0;
1538  if(board[i] == '1') val = 1;
1539  else if(board[i] == '2') val = -1;
1540  X.vals[count][i] = val;
1541  }
1542  ++count;
1543  free(label);
1544  free(board);
1545  }
1546  X = resize_matrix(X, count);
1547  y = resize_matrix(y, count);
1548 
1549  data d = {0};
1550  d.shallow = 0;
1551  d.X = X;
1552  d.y = y;
1553 
1554 
1555  fclose(fp);
1556 
1557  return d;
1558 }
1559 
1560 
1562 {
1563  int i;
1564  for(i = d.X.rows-1; i > 0; --i){
1565  int index = rand()%i;
1566  float *swap = d.X.vals[index];
1567  d.X.vals[index] = d.X.vals[i];
1568  d.X.vals[i] = swap;
1569 
1570  swap = d.y.vals[index];
1571  d.y.vals[index] = d.y.vals[i];
1572  d.y.vals[i] = swap;
1573  }
1574 }
1575 
1576 void scale_data_rows(data d, float s)
1577 {
1578  int i;
1579  for(i = 0; i < d.X.rows; ++i){
1580  scale_array(d.X.vals[i], d.X.cols, s);
1581  }
1582 }
1583 
1584 void translate_data_rows(data d, float s)
1585 {
1586  int i;
1587  for(i = 0; i < d.X.rows; ++i){
1588  translate_array(d.X.vals[i], d.X.cols, s);
1589  }
1590 }
1591 
1593 {
1594  data c = {0};
1595  c.w = d.w;
1596  c.h = d.h;
1597  c.shallow = 0;
1598  c.num_boxes = d.num_boxes;
1599  c.boxes = d.boxes;
1600  c.X = copy_matrix(d.X);
1601  c.y = copy_matrix(d.y);
1602  return c;
1603 }
1604 
1606 {
1607  int i;
1608  for(i = 0; i < d.X.rows; ++i){
1609  normalize_array(d.X.vals[i], d.X.cols);
1610  }
1611 }
1612 
1613 data get_data_part(data d, int part, int total)
1614 {
1615  data p = {0};
1616  p.shallow = 1;
1617  p.X.rows = d.X.rows * (part + 1) / total - d.X.rows * part / total;
1618  p.y.rows = d.y.rows * (part + 1) / total - d.y.rows * part / total;
1619  p.X.cols = d.X.cols;
1620  p.y.cols = d.y.cols;
1621  p.X.vals = d.X.vals + d.X.rows * part / total;
1622  p.y.vals = d.y.vals + d.y.rows * part / total;
1623  return p;
1624 }
1625 
1627 {
1628  data r = {0};
1629  r.shallow = 1;
1630 
1631  r.X.rows = num;
1632  r.y.rows = num;
1633 
1634  r.X.cols = d.X.cols;
1635  r.y.cols = d.y.cols;
1636 
1637  r.X.vals = calloc(num, sizeof(float *));
1638  r.y.vals = calloc(num, sizeof(float *));
1639 
1640  int i;
1641  for(i = 0; i < num; ++i){
1642  int index = rand()%d.X.rows;
1643  r.X.vals[i] = d.X.vals[index];
1644  r.y.vals[i] = d.y.vals[index];
1645  }
1646  return r;
1647 }
1648 
1649 data *split_data(data d, int part, int total)
1650 {
1651  data *split = calloc(2, sizeof(data));
1652  int i;
1653  int start = part*d.X.rows/total;
1654  int end = (part+1)*d.X.rows/total;
1655  data train;
1656  data test;
1657  train.shallow = test.shallow = 1;
1658 
1659  test.X.rows = test.y.rows = end-start;
1660  train.X.rows = train.y.rows = d.X.rows - (end-start);
1661  train.X.cols = test.X.cols = d.X.cols;
1662  train.y.cols = test.y.cols = d.y.cols;
1663 
1664  train.X.vals = calloc(train.X.rows, sizeof(float*));
1665  test.X.vals = calloc(test.X.rows, sizeof(float*));
1666  train.y.vals = calloc(train.y.rows, sizeof(float*));
1667  test.y.vals = calloc(test.y.rows, sizeof(float*));
1668 
1669  for(i = 0; i < start; ++i){
1670  train.X.vals[i] = d.X.vals[i];
1671  train.y.vals[i] = d.y.vals[i];
1672  }
1673  for(i = start; i < end; ++i){
1674  test.X.vals[i-start] = d.X.vals[i];
1675  test.y.vals[i-start] = d.y.vals[i];
1676  }
1677  for(i = end; i < d.X.rows; ++i){
1678  train.X.vals[i-(end-start)] = d.X.vals[i];
1679  train.y.vals[i-(end-start)] = d.y.vals[i];
1680  }
1681  split[0] = train;
1682  split[1] = test;
1683  return split;
1684 }
1685 
pthread_t load_data(load_args args)
Definition: data.c:1180
data load_categorical_data_csv(char *filename, int target, int k)
Definition: data.c:1405
void list_insert(list *l, void *val)
Definition: list.c:40
matrix csv_to_matrix(char *filename)
Definition: matrix.c:133
matrix load_image_paths(char **paths, int n, int w, int h)
Definition: data.c:89
float hue
Definition: darknet.h:576
void normalize_array(float *a, int n)
Definition: utils.c:554
data load_data_detection(int n, char **paths, int m, int w, int h, int boxes, int classes, float jitter, float hue, float saturation, float exposure)
Definition: data.c:1036
char ** paths
Definition: darknet.h:553
int out_w
Definition: darknet.h:560
image resize_image(image im, int w, int h)
Definition: image.c:1351
void get_random_batch(data d, int n, float *X, float *y)
Definition: data.c:1449
int id
Definition: darknet.h:585
float constrain(float min, float max, float a)
Definition: utils.c:531
void load_rle(image im, int *rle, int n)
Definition: data.c:303
void scale_array(float *a, int n, float s)
Definition: utils.c:584
make_image
Definition: darknet.py:61
image * im
Definition: darknet.h:578
int rows
Definition: darknet.h:533
int out_h
Definition: darknet.h:561
int * parent
Definition: darknet.h:45
pthread_mutex_t mutex
Definition: data.c:10
int coords
Definition: darknet.h:570
void fill_hierarchy(float *truth, int k, tree *hierarchy)
Definition: data.c:558
float ** one_hot_encode(float *a, int n, int k)
Definition: utils.c:715
int w
Definition: darknet.h:559
int cols
Definition: darknet.h:533
data get_random_data(data d, int num)
Definition: data.c:1626
matrix resize_matrix(matrix m, int size)
Definition: matrix.c:47
int max_index(float *a, int n)
Definition: utils.c:619
float rad
Definition: darknet.h:506
float h
Definition: darknet.h:520
matrix load_image_augment_paths(char **paths, int n, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center)
Definition: data.c:105
char int_to_alphanum(int i)
Definition: utils.c:197
int * num_boxes
Definition: darknet.h:543
int max
Definition: darknet.h:565
int w
Definition: darknet.h:539
float aspect
Definition: darknet.h:573
data * tile_data(data orig, int divs, int size)
Definition: data.c:1293
void * load_threads(void *ptr)
Definition: data.c:1144
void ** list_to_array(list *l)
Definition: list.c:82
image grayscale_image(image im)
Definition: image.c:1212
matrix copy_matrix(matrix m)
Definition: matrix.c:77
void get_next_batch(data d, int n, int offset, float *X, float *y)
Definition: data.c:1459
void free_list(list *l)
Definition: list.c:67
float bottom
Definition: darknet.h:587
Definition: darknet.h:512
char ** get_random_paths(char **paths, int n, int m)
Definition: data.c:42
int h
Definition: darknet.h:558
float jitter
Definition: darknet.h:571
matrix load_image_paths_gray(char **paths, int n, int w, int h)
Definition: data.c:68
void flip_image(image a)
Definition: image.c:349
data_type type
Definition: darknet.h:580
image float_to_image(int w, int h, int c, float *data)
Definition: image.c:774
int size
Definition: darknet.h:565
data load_data_iseg(int n, char **paths, int m, int w, int h, int classes, int boxes, int div, int min, int max, float angle, float aspect, float hue, float saturation, float exposure)
Definition: data.c:785
void fill_image(image m, float s)
Definition: image.c:843
void scale_data_rows(data d, float s)
Definition: data.c:1576
box bound_image(image im)
Definition: data.c:342
data concat_data(data d1, data d2)
Definition: data.c:1382
float exposure
Definition: darknet.h:575
image get_segmentation_image(char *path, int w, int h, int classes)
Definition: data.c:676
float y
Definition: darknet.h:586
image get_segmentation_image2(char *path, int w, int h, int classes)
Definition: data.c:703
void randomize_data(data d)
Definition: data.c:1561
data concat_datas(data *d, int n)
Definition: data.c:1393
float w
Definition: darknet.h:520
int h
Definition: darknet.h:514
data load_data_seg(int n, char **paths, int m, int w, int h, int classes, int min, int max, float angle, float aspect, float hue, float saturation, float exposure, int div)
Definition: data.c:737
int center
Definition: darknet.h:569
void file_error(char *s)
Definition: utils.c:281
letterbox_image
Definition: darknet.py:98
void print_letters(float *pred, int n)
Definition: data.c:491
void load_data_blocking(load_args args)
Definition: data.c:1173
Definition: darknet.h:42
image random_crop_image(image im, int w, int h)
Definition: image.c:1017
int groups
Definition: darknet.h:50
float x
Definition: darknet.h:520
int threads
Definition: darknet.h:552
int num_boxes
Definition: darknet.h:564
void smooth_data(data d)
Definition: data.c:1469
load_image
Definition: darknet.py:106
int m
Definition: darknet.h:556
int alphanum_to_int(char c)
Definition: utils.c:193
data load_data_captcha_encode(char **paths, int n, int m, int w, int h)
Definition: data.c:531
image rotate_crop_image(image im, float rad, float s, int w, int h, float dx, float dy, float aspect)
Definition: image.c:805
int * read_intlist(char *s, int *n, int d)
Definition: utils.c:36
char * fgetl(FILE *fp)
Definition: utils.c:335
data * d
Definition: darknet.h:577
free_image
Definition: darknet.py:95
data load_all_cifar10()
Definition: data.c:1481
image center_crop_image(image im, int w, int h)
Definition: image.c:796
float w
Definition: darknet.h:586
matrix load_tags_paths(char **paths, int n, int k)
Definition: data.c:633
void or_image(image src, image dest, int c)
Definition: data.c:319
data load_data_augment(char **paths, int n, int m, char **labels, int k, tree *hierarchy, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure, int center)
Definition: data.c:1340
void fill_truth_mask(char *path, int num_boxes, float *truth, int classes, int w, int h, augment_args aug, int flip, int mw, int mh)
Definition: data.c:402
image load_image_color(char *filename, int w, int h)
Definition: image.c:1486
data load_data_regression(char **paths, int n, int m, int k, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure)
Definition: data.c:1259
list * get_paths(char *filename)
Definition: data.c:12
void correct_boxes(box_label *boxes, int n, float dx, float dy, float sx, float sy, int flip)
Definition: data.c:180
data load_go(char *filename)
Definition: data.c:1514
int classes
Definition: darknet.h:566
matrix load_labels_paths(char **paths, int n, char **labels, int k, tree *hierarchy)
Definition: data.c:620
box_label * read_boxes(char *filename, int *n)
Definition: data.c:139
tree * hierarchy
Definition: darknet.h:581
data copy_data(data d)
Definition: data.c:1592
void fill_truth(char *path, char **labels, int k, float *truth)
Definition: data.c:543
data load_data_old(char **paths, int n, int m, char **labels, int k, int w, int h)
Definition: data.c:1204
data load_data_writing(char **paths, int n, int m, int w, int h, int out_w, int out_h)
Definition: data.c:1189
float top
Definition: darknet.h:587
float h
Definition: darknet.h:586
int shallow
Definition: darknet.h:542
int scale
Definition: darknet.h:568
#define NUMCHARS
Definition: data.c:489
int * group_size
Definition: darknet.h:51
float saturation
Definition: darknet.h:574
float x
Definition: darknet.h:586
data get_data_part(data d, int part, int total)
Definition: data.c:1613
float dx
Definition: darknet.h:507
void fill_truth_region(char *path, float *truth, int classes, int num_boxes, int flip, float dx, float dy, float sx, float sy)
Definition: data.c:255
char ** find_replace_paths(char **paths, int n, char *find, char *replace)
Definition: data.c:56
float left
Definition: darknet.h:587
int n
Definition: darknet.h:555
image crop_image(image im, int dx, int dy, int w, int h)
Definition: image.c:861
void translate_data_rows(data d, float s)
Definition: data.c:1584
void free_matrix(matrix m)
Definition: matrix.c:10
void * load_thread(void *ptr)
Definition: data.c:1090
int c
Definition: darknet.h:515
int w
Definition: darknet.h:513
void translate_array(float *a, int n, float s)
Definition: utils.c:566
char * path
Definition: darknet.h:554
void random_distort_image(image im, float hue, float saturation, float exposure)
Definition: image.c:1334
void fill_truth_detection(char *path, int num_boxes, float *truth, int classes, int flip, float dx, float dy, float sx, float sy)
Definition: data.c:447
Definition: darknet.h:602
int min
Definition: darknet.h:565
data load_cifar10_data(char *filename)
Definition: data.c:1422
void fill_truth_swag(char *path, float *truth, int classes, int flip, float dx, float dy, float sx, float sy)
Definition: data.c:217
char ** labels
Definition: darknet.h:557
matrix X
Definition: darknet.h:540
float scale
Definition: darknet.h:505
image * resized
Definition: darknet.h:579
data load_data_tag(char **paths, int n, int m, int k, int min, int max, int size, float angle, float aspect, float hue, float saturation, float exposure)
Definition: data.c:1353
float right
Definition: darknet.h:587
pthread_t load_data_in_thread(load_args args)
Definition: data.c:1135
char ** get_labels(char *filename)
Definition: data.c:657
void fill_truth_iseg(char *path, int num_boxes, float *truth, int classes, int w, int h, augment_args aug, int flip, int mw, int mh)
Definition: data.c:364
void exclusive_image(image src)
Definition: data.c:327
#define SECRET_NUM
Definition: darknet.h:8
float ** vals
Definition: darknet.h:534
void randomize_boxes(box_label *b, int n)
Definition: data.c:169
data resize_data(data orig, int w, int h)
Definition: data.c:1320
float aspect
Definition: darknet.h:509
void find_replace(char *str, char *orig, char *rep, char *output)
Definition: utils.c:216
list * make_list()
Definition: list.c:5
matrix make_matrix(int rows, int cols)
Definition: matrix.c:91
data load_data_compare(int n, char **paths, int m, int classes, int w, int h)
Definition: data.c:919
float y
Definition: darknet.h:520
float angle
Definition: darknet.h:572
data select_data(data *orig, int *inds)
Definition: data.c:1270
data load_data_swag(char **paths, int n, int classes, float jitter)
Definition: data.c:983
image random_augment_image(image im, float angle, float aspect, int low, int high, int w, int h)
Definition: image.c:1052
void normalize_data_rows(data d)
Definition: data.c:1605
data load_data_region(int n, char **paths, int m, int w, int h, int size, int classes, float jitter, float hue, float saturation, float exposure)
Definition: data.c:865
float rand_uniform(float min, float max)
Definition: utils.c:698
void free_data(data d)
Definition: data.c:665
void fill_truth_captcha(char *path, int n, float *truth)
Definition: data.c:501
void place_image(image im, int w, int h, int dx, int dy, image canvas)
Definition: image.c:781
matrix load_regression_labels_paths(char **paths, int n, int k)
Definition: data.c:590
data * split_data(data d, int part, int total)
Definition: data.c:1649
void error(const char *s)
Definition: utils.c:253
augment_args random_augment_args(image im, float angle, float aspect, int low, int high, int w, int h)
Definition: image.c:1025
data load_data_captcha(char **paths, int n, int m, int k, int w, int h)
Definition: data.c:516
list classes
Definition: voc_label.py:9
int h
Definition: darknet.h:539
Definition: darknet.h:538
box ** boxes
Definition: darknet.h:544
data load_data_mask(int n, char **paths, int m, int w, int h, int classes, int boxes, int coords, int min, int max, float angle, float aspect, float hue, float saturation, float exposure)
Definition: data.c:825
float dy
Definition: darknet.h:508
char * copy_string(char *s)
Definition: utils.c:423
Definition: darknet.h:519
float * pop_column(matrix *m, int c)
Definition: matrix.c:119
data load_data_super(char **paths, int n, int m, int w, int h, int scale)
Definition: data.c:1229
float * data
Definition: darknet.h:516
matrix y
Definition: darknet.h:541
matrix concat_matrix(matrix m1, matrix m2)
Definition: data.c:1366