darknet  v3
classifier.c
Go to the documentation of this file.
1 #include "darknet.h"
2 
3 #include <sys/time.h>
4 #include <assert.h>
5 
6 float *get_regression_values(char **labels, int n)
7 {
8  float *v = calloc(n, sizeof(float));
9  int i;
10  for(i = 0; i < n; ++i){
11  char *p = strchr(labels[i], ' ');
12  *p = 0;
13  v[i] = atof(p+1);
14  }
15  return v;
16 }
17 
18 void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
19 {
20  int i;
21 
22  float avg_loss = -1;
23  char *base = basecfg(cfgfile);
24  printf("%s\n", base);
25  printf("%d\n", ngpus);
26  network **nets = calloc(ngpus, sizeof(network*));
27 
28  srand(time(0));
29  int seed = rand();
30  for(i = 0; i < ngpus; ++i){
31  srand(seed);
32 #ifdef GPU
33  cuda_set_device(gpus[i]);
34 #endif
35  nets[i] = load_network(cfgfile, weightfile, clear);
36  nets[i]->learning_rate *= ngpus;
37  }
38  srand(time(0));
39  network *net = nets[0];
40 
41  int imgs = net->batch * net->subdivisions * ngpus;
42 
43  printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
44  list *options = read_data_cfg(datacfg);
45 
46  char *backup_directory = option_find_str(options, "backup", "/backup/");
47  int tag = option_find_int_quiet(options, "tag", 0);
48  char *label_list = option_find_str(options, "labels", "data/labels.list");
49  char *train_list = option_find_str(options, "train", "data/train.list");
50  char *tree = option_find_str(options, "tree", 0);
51  if (tree) net->hierarchy = read_tree(tree);
52  int classes = option_find_int(options, "classes", 2);
53 
54  char **labels = 0;
55  if(!tag){
56  labels = get_labels(label_list);
57  }
58  list *plist = get_paths(train_list);
59  char **paths = (char **)list_to_array(plist);
60  printf("%d\n", plist->size);
61  int N = plist->size;
62  double time;
63 
64  load_args args = {0};
65  args.w = net->w;
66  args.h = net->h;
67  args.threads = 32;
68  args.hierarchy = net->hierarchy;
69 
70  args.min = net->min_ratio*net->w;
71  args.max = net->max_ratio*net->w;
72  printf("%d %d\n", args.min, args.max);
73  args.angle = net->angle;
74  args.aspect = net->aspect;
75  args.exposure = net->exposure;
76  args.saturation = net->saturation;
77  args.hue = net->hue;
78  args.size = net->w;
79 
80  args.paths = paths;
81  args.classes = classes;
82  args.n = imgs;
83  args.m = N;
84  args.labels = labels;
85  if (tag){
86  args.type = TAG_DATA;
87  } else {
89  }
90 
91  data train;
92  data buffer;
93  pthread_t load_thread;
94  args.d = &buffer;
95  load_thread = load_data(args);
96 
97  int count = 0;
98  int epoch = (*net->seen)/N;
99  while(get_current_batch(net) < net->max_batches || net->max_batches == 0){
100  if(net->random && count++%40 == 0){
101  printf("Resizing\n");
102  int dim = (rand() % 11 + 4) * 32;
103  //if (get_current_batch(net)+200 > net->max_batches) dim = 608;
104  //int dim = (rand() % 4 + 16) * 32;
105  printf("%d\n", dim);
106  args.w = dim;
107  args.h = dim;
108  args.size = dim;
109  args.min = net->min_ratio*dim;
110  args.max = net->max_ratio*dim;
111  printf("%d %d\n", args.min, args.max);
112 
113  pthread_join(load_thread, 0);
114  train = buffer;
115  free_data(train);
116  load_thread = load_data(args);
117 
118  for(i = 0; i < ngpus; ++i){
119  resize_network(nets[i], dim, dim);
120  }
121  net = nets[0];
122  }
123  time = what_time_is_it_now();
124 
125  pthread_join(load_thread, 0);
126  train = buffer;
127  load_thread = load_data(args);
128 
129  printf("Loaded: %lf seconds\n", what_time_is_it_now()-time);
130  time = what_time_is_it_now();
131 
132  float loss = 0;
133 #ifdef GPU
134  if(ngpus == 1){
135  loss = train_network(net, train);
136  } else {
137  loss = train_networks(nets, ngpus, train, 4);
138  }
139 #else
140  loss = train_network(net, train);
141 #endif
142  if(avg_loss == -1) avg_loss = loss;
143  avg_loss = avg_loss*.9 + loss*.1;
144  printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, *net->seen);
145  free_data(train);
146  if(*net->seen/N > epoch){
147  epoch = *net->seen/N;
148  char buff[256];
149  sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch);
150  save_weights(net, buff);
151  }
152  if(get_current_batch(net)%1000 == 0){
153  char buff[256];
154  sprintf(buff, "%s/%s.backup",backup_directory,base);
155  save_weights(net, buff);
156  }
157  }
158  char buff[256];
159  sprintf(buff, "%s/%s.weights", backup_directory, base);
160  save_weights(net, buff);
161  pthread_join(load_thread, 0);
162 
163  free_network(net);
164  if(labels) free_ptrs((void**)labels, classes);
165  free_ptrs((void**)paths, plist->size);
166  free_list(plist);
167  free(base);
168 }
169 
170 void validate_classifier_crop(char *datacfg, char *filename, char *weightfile)
171 {
172  int i = 0;
173  network *net = load_network(filename, weightfile, 0);
174  srand(time(0));
175 
176  list *options = read_data_cfg(datacfg);
177 
178  char *label_list = option_find_str(options, "labels", "data/labels.list");
179  char *valid_list = option_find_str(options, "valid", "data/train.list");
180  int classes = option_find_int(options, "classes", 2);
181  int topk = option_find_int(options, "top", 1);
182 
183  char **labels = get_labels(label_list);
184  list *plist = get_paths(valid_list);
185 
186  char **paths = (char **)list_to_array(plist);
187  int m = plist->size;
188  free_list(plist);
189 
190  clock_t time;
191  float avg_acc = 0;
192  float avg_topk = 0;
193  int splits = m/1000;
194  int num = (i+1)*m/splits - i*m/splits;
195 
196  data val, buffer;
197 
198  load_args args = {0};
199  args.w = net->w;
200  args.h = net->h;
201 
202  args.paths = paths;
203  args.classes = classes;
204  args.n = num;
205  args.m = 0;
206  args.labels = labels;
207  args.d = &buffer;
209 
210  pthread_t load_thread = load_data_in_thread(args);
211  for(i = 1; i <= splits; ++i){
212  time=clock();
213 
214  pthread_join(load_thread, 0);
215  val = buffer;
216 
217  num = (i+1)*m/splits - i*m/splits;
218  char **part = paths+(i*m/splits);
219  if(i != splits){
220  args.paths = part;
221  load_thread = load_data_in_thread(args);
222  }
223  printf("Loaded: %d images in %lf seconds\n", val.X.rows, sec(clock()-time));
224 
225  time=clock();
226  float *acc = network_accuracies(net, val, topk);
227  avg_acc += acc[0];
228  avg_topk += acc[1];
229  printf("%d: top 1: %f, top %d: %f, %lf seconds, %d images\n", i, avg_acc/i, topk, avg_topk/i, sec(clock()-time), val.X.rows);
230  free_data(val);
231  }
232 }
233 
234 void validate_classifier_10(char *datacfg, char *filename, char *weightfile)
235 {
236  int i, j;
237  network *net = load_network(filename, weightfile, 0);
238  set_batch_network(net, 1);
239  srand(time(0));
240 
241  list *options = read_data_cfg(datacfg);
242 
243  char *label_list = option_find_str(options, "labels", "data/labels.list");
244  char *valid_list = option_find_str(options, "valid", "data/train.list");
245  int classes = option_find_int(options, "classes", 2);
246  int topk = option_find_int(options, "top", 1);
247 
248  char **labels = get_labels(label_list);
249  list *plist = get_paths(valid_list);
250 
251  char **paths = (char **)list_to_array(plist);
252  int m = plist->size;
253  free_list(plist);
254 
255  float avg_acc = 0;
256  float avg_topk = 0;
257  int *indexes = calloc(topk, sizeof(int));
258 
259  for(i = 0; i < m; ++i){
260  int class = -1;
261  char *path = paths[i];
262  for(j = 0; j < classes; ++j){
263  if(strstr(path, labels[j])){
264  class = j;
265  break;
266  }
267  }
268  int w = net->w;
269  int h = net->h;
270  int shift = 32;
271  image im = load_image_color(paths[i], w+shift, h+shift);
272  image images[10];
273  images[0] = crop_image(im, -shift, -shift, w, h);
274  images[1] = crop_image(im, shift, -shift, w, h);
275  images[2] = crop_image(im, 0, 0, w, h);
276  images[3] = crop_image(im, -shift, shift, w, h);
277  images[4] = crop_image(im, shift, shift, w, h);
278  flip_image(im);
279  images[5] = crop_image(im, -shift, -shift, w, h);
280  images[6] = crop_image(im, shift, -shift, w, h);
281  images[7] = crop_image(im, 0, 0, w, h);
282  images[8] = crop_image(im, -shift, shift, w, h);
283  images[9] = crop_image(im, shift, shift, w, h);
284  float *pred = calloc(classes, sizeof(float));
285  for(j = 0; j < 10; ++j){
286  float *p = network_predict(net, images[j].data);
287  if(net->hierarchy) hierarchy_predictions(p, net->outputs, net->hierarchy, 1, 1);
288  axpy_cpu(classes, 1, p, 1, pred, 1);
289  free_image(images[j]);
290  }
291  free_image(im);
292  top_k(pred, classes, topk, indexes);
293  free(pred);
294  if(indexes[0] == class) avg_acc += 1;
295  for(j = 0; j < topk; ++j){
296  if(indexes[j] == class) avg_topk += 1;
297  }
298 
299  printf("%d: top 1: %f, top %d: %f\n", i, avg_acc/(i+1), topk, avg_topk/(i+1));
300  }
301 }
302 
303 void validate_classifier_full(char *datacfg, char *filename, char *weightfile)
304 {
305  int i, j;
306  network *net = load_network(filename, weightfile, 0);
307  set_batch_network(net, 1);
308  srand(time(0));
309 
310  list *options = read_data_cfg(datacfg);
311 
312  char *label_list = option_find_str(options, "labels", "data/labels.list");
313  char *valid_list = option_find_str(options, "valid", "data/train.list");
314  int classes = option_find_int(options, "classes", 2);
315  int topk = option_find_int(options, "top", 1);
316 
317  char **labels = get_labels(label_list);
318  list *plist = get_paths(valid_list);
319 
320  char **paths = (char **)list_to_array(plist);
321  int m = plist->size;
322  free_list(plist);
323 
324  float avg_acc = 0;
325  float avg_topk = 0;
326  int *indexes = calloc(topk, sizeof(int));
327 
328  int size = net->w;
329  for(i = 0; i < m; ++i){
330  int class = -1;
331  char *path = paths[i];
332  for(j = 0; j < classes; ++j){
333  if(strstr(path, labels[j])){
334  class = j;
335  break;
336  }
337  }
338  image im = load_image_color(paths[i], 0, 0);
339  image resized = resize_min(im, size);
340  resize_network(net, resized.w, resized.h);
341  //show_image(im, "orig");
342  //show_image(crop, "cropped");
343  //cvWaitKey(0);
344  float *pred = network_predict(net, resized.data);
345  if(net->hierarchy) hierarchy_predictions(pred, net->outputs, net->hierarchy, 1, 1);
346 
347  free_image(im);
348  free_image(resized);
349  top_k(pred, classes, topk, indexes);
350 
351  if(indexes[0] == class) avg_acc += 1;
352  for(j = 0; j < topk; ++j){
353  if(indexes[j] == class) avg_topk += 1;
354  }
355 
356  printf("%d: top 1: %f, top %d: %f\n", i, avg_acc/(i+1), topk, avg_topk/(i+1));
357  }
358 }
359 
360 
361 void validate_classifier_single(char *datacfg, char *filename, char *weightfile)
362 {
363  int i, j;
364  network *net = load_network(filename, weightfile, 0);
365  set_batch_network(net, 1);
366  srand(time(0));
367 
368  list *options = read_data_cfg(datacfg);
369 
370  char *label_list = option_find_str(options, "labels", "data/labels.list");
371  char *leaf_list = option_find_str(options, "leaves", 0);
372  if(leaf_list) change_leaves(net->hierarchy, leaf_list);
373  char *valid_list = option_find_str(options, "valid", "data/train.list");
374  int classes = option_find_int(options, "classes", 2);
375  int topk = option_find_int(options, "top", 1);
376 
377  char **labels = get_labels(label_list);
378  list *plist = get_paths(valid_list);
379 
380  char **paths = (char **)list_to_array(plist);
381  int m = plist->size;
382  free_list(plist);
383 
384  float avg_acc = 0;
385  float avg_topk = 0;
386  int *indexes = calloc(topk, sizeof(int));
387 
388  for(i = 0; i < m; ++i){
389  int class = -1;
390  char *path = paths[i];
391  for(j = 0; j < classes; ++j){
392  if(strstr(path, labels[j])){
393  class = j;
394  break;
395  }
396  }
397  image im = load_image_color(paths[i], 0, 0);
398  image crop = center_crop_image(im, net->w, net->h);
399  //grayscale_image_3c(crop);
400  //show_image(im, "orig");
401  //show_image(crop, "cropped");
402  //cvWaitKey(0);
403  float *pred = network_predict(net, crop.data);
404  if(net->hierarchy) hierarchy_predictions(pred, net->outputs, net->hierarchy, 1, 1);
405 
406  free_image(im);
407  free_image(crop);
408  top_k(pred, classes, topk, indexes);
409 
410  if(indexes[0] == class) avg_acc += 1;
411  for(j = 0; j < topk; ++j){
412  if(indexes[j] == class) avg_topk += 1;
413  }
414 
415  printf("%s, %d, %f, %f, \n", paths[i], class, pred[0], pred[1]);
416  printf("%d: top 1: %f, top %d: %f\n", i, avg_acc/(i+1), topk, avg_topk/(i+1));
417  }
418 }
419 
420 void validate_classifier_multi(char *datacfg, char *cfg, char *weights)
421 {
422  int i, j;
423  network *net = load_network(cfg, weights, 0);
424  set_batch_network(net, 1);
425  srand(time(0));
426 
427  list *options = read_data_cfg(datacfg);
428 
429  char *label_list = option_find_str(options, "labels", "data/labels.list");
430  char *valid_list = option_find_str(options, "valid", "data/train.list");
431  int classes = option_find_int(options, "classes", 2);
432  int topk = option_find_int(options, "top", 1);
433 
434  char **labels = get_labels(label_list);
435  list *plist = get_paths(valid_list);
436  //int scales[] = {224, 288, 320, 352, 384};
437  int scales[] = {224, 256, 288, 320};
438  int nscales = sizeof(scales)/sizeof(scales[0]);
439 
440  char **paths = (char **)list_to_array(plist);
441  int m = plist->size;
442  free_list(plist);
443 
444  float avg_acc = 0;
445  float avg_topk = 0;
446  int *indexes = calloc(topk, sizeof(int));
447 
448  for(i = 0; i < m; ++i){
449  int class = -1;
450  char *path = paths[i];
451  for(j = 0; j < classes; ++j){
452  if(strstr(path, labels[j])){
453  class = j;
454  break;
455  }
456  }
457  float *pred = calloc(classes, sizeof(float));
458  image im = load_image_color(paths[i], 0, 0);
459  for(j = 0; j < nscales; ++j){
460  image r = resize_max(im, scales[j]);
461  resize_network(net, r.w, r.h);
462  float *p = network_predict(net, r.data);
463  if(net->hierarchy) hierarchy_predictions(p, net->outputs, net->hierarchy, 1 , 1);
464  axpy_cpu(classes, 1, p, 1, pred, 1);
465  flip_image(r);
466  p = network_predict(net, r.data);
467  axpy_cpu(classes, 1, p, 1, pred, 1);
468  if(r.data != im.data) free_image(r);
469  }
470  free_image(im);
471  top_k(pred, classes, topk, indexes);
472  free(pred);
473  if(indexes[0] == class) avg_acc += 1;
474  for(j = 0; j < topk; ++j){
475  if(indexes[j] == class) avg_topk += 1;
476  }
477 
478  printf("%d: top 1: %f, top %d: %f\n", i, avg_acc/(i+1), topk, avg_topk/(i+1));
479  }
480 }
481 
482 void try_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int layer_num)
483 {
484  network *net = load_network(cfgfile, weightfile, 0);
485  set_batch_network(net, 1);
486  srand(2222222);
487 
488  list *options = read_data_cfg(datacfg);
489 
490  char *name_list = option_find_str(options, "names", 0);
491  if(!name_list) name_list = option_find_str(options, "labels", "data/labels.list");
492  int top = option_find_int(options, "top", 1);
493 
494  int i = 0;
495  char **names = get_labels(name_list);
496  clock_t time;
497  int *indexes = calloc(top, sizeof(int));
498  char buff[256];
499  char *input = buff;
500  while(1){
501  if(filename){
502  strncpy(input, filename, 256);
503  }else{
504  printf("Enter Image Path: ");
505  fflush(stdout);
506  input = fgets(input, 256, stdin);
507  if(!input) return;
508  strtok(input, "\n");
509  }
510  image orig = load_image_color(input, 0, 0);
511  image r = resize_min(orig, 256);
512  image im = crop_image(r, (r.w - 224 - 1)/2 + 1, (r.h - 224 - 1)/2 + 1, 224, 224);
513  float mean[] = {0.48263312050943, 0.45230225481413, 0.40099074308742};
514  float std[] = {0.22590347483426, 0.22120921437787, 0.22103996251583};
515  float var[3];
516  var[0] = std[0]*std[0];
517  var[1] = std[1]*std[1];
518  var[2] = std[2]*std[2];
519 
520  normalize_cpu(im.data, mean, var, 1, 3, im.w*im.h);
521 
522  float *X = im.data;
523  time=clock();
524  float *predictions = network_predict(net, X);
525 
526  layer l = net->layers[layer_num];
527  for(i = 0; i < l.c; ++i){
528  if(l.rolling_mean) printf("%f %f %f\n", l.rolling_mean[i], l.rolling_variance[i], l.scales[i]);
529  }
530 #ifdef GPU
531  cuda_pull_array(l.output_gpu, l.output, l.outputs);
532 #endif
533  for(i = 0; i < l.outputs; ++i){
534  printf("%f\n", l.output[i]);
535  }
536  /*
537 
538  printf("\n\nWeights\n");
539  for(i = 0; i < l.n*l.size*l.size*l.c; ++i){
540  printf("%f\n", l.filters[i]);
541  }
542 
543  printf("\n\nBiases\n");
544  for(i = 0; i < l.n; ++i){
545  printf("%f\n", l.biases[i]);
546  }
547  */
548 
549  top_predictions(net, top, indexes);
550  printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
551  for(i = 0; i < top; ++i){
552  int index = indexes[i];
553  printf("%s: %f\n", names[index], predictions[index]);
554  }
555  free_image(im);
556  if (filename) break;
557  }
558 }
559 
560 void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top)
561 {
562  network *net = load_network(cfgfile, weightfile, 0);
563  set_batch_network(net, 1);
564  srand(2222222);
565 
566  list *options = read_data_cfg(datacfg);
567 
568  char *name_list = option_find_str(options, "names", 0);
569  if(!name_list) name_list = option_find_str(options, "labels", "data/labels.list");
570  if(top == 0) top = option_find_int(options, "top", 1);
571 
572  int i = 0;
573  char **names = get_labels(name_list);
574  clock_t time;
575  int *indexes = calloc(top, sizeof(int));
576  char buff[256];
577  char *input = buff;
578  while(1){
579  if(filename){
580  strncpy(input, filename, 256);
581  }else{
582  printf("Enter Image Path: ");
583  fflush(stdout);
584  input = fgets(input, 256, stdin);
585  if(!input) return;
586  strtok(input, "\n");
587  }
588  image im = load_image_color(input, 0, 0);
589  image r = letterbox_image(im, net->w, net->h);
590  //image r = resize_min(im, 320);
591  //printf("%d %d\n", r.w, r.h);
592  //resize_network(net, r.w, r.h);
593  //printf("%d %d\n", r.w, r.h);
594 
595  float *X = r.data;
596  time=clock();
597  float *predictions = network_predict(net, X);
598  if(net->hierarchy) hierarchy_predictions(predictions, net->outputs, net->hierarchy, 1, 1);
599  top_k(predictions, net->outputs, top, indexes);
600  fprintf(stderr, "%s: Predicted in %f seconds.\n", input, sec(clock()-time));
601  for(i = 0; i < top; ++i){
602  int index = indexes[i];
603  //if(net->hierarchy) printf("%d, %s: %f, parent: %s \n",index, names[index], predictions[index], (net->hierarchy->parent[index] >= 0) ? names[net->hierarchy->parent[index]] : "Root");
604  //else printf("%s: %f\n",names[index], predictions[index]);
605  printf("%5.2f%%: %s\n", predictions[index]*100, names[index]);
606  }
607  if(r.data != im.data) free_image(r);
608  free_image(im);
609  if (filename) break;
610  }
611 }
612 
613 
614 void label_classifier(char *datacfg, char *filename, char *weightfile)
615 {
616  int i;
617  network *net = load_network(filename, weightfile, 0);
618  set_batch_network(net, 1);
619  srand(time(0));
620 
621  list *options = read_data_cfg(datacfg);
622 
623  char *label_list = option_find_str(options, "names", "data/labels.list");
624  char *test_list = option_find_str(options, "test", "data/train.list");
625  int classes = option_find_int(options, "classes", 2);
626 
627  char **labels = get_labels(label_list);
628  list *plist = get_paths(test_list);
629 
630  char **paths = (char **)list_to_array(plist);
631  int m = plist->size;
632  free_list(plist);
633 
634  for(i = 0; i < m; ++i){
635  image im = load_image_color(paths[i], 0, 0);
636  image resized = resize_min(im, net->w);
637  image crop = crop_image(resized, (resized.w - net->w)/2, (resized.h - net->h)/2, net->w, net->h);
638  float *pred = network_predict(net, crop.data);
639 
640  if(resized.data != im.data) free_image(resized);
641  free_image(im);
642  free_image(crop);
643  int ind = max_index(pred, classes);
644 
645  printf("%s\n", labels[ind]);
646  }
647 }
648 
649 void csv_classifier(char *datacfg, char *cfgfile, char *weightfile)
650 {
651  int i,j;
652  network *net = load_network(cfgfile, weightfile, 0);
653  srand(time(0));
654 
655  list *options = read_data_cfg(datacfg);
656 
657  char *test_list = option_find_str(options, "test", "data/test.list");
658  int top = option_find_int(options, "top", 1);
659 
660  list *plist = get_paths(test_list);
661 
662  char **paths = (char **)list_to_array(plist);
663  int m = plist->size;
664  free_list(plist);
665  int *indexes = calloc(top, sizeof(int));
666 
667  for(i = 0; i < m; ++i){
668  double time = what_time_is_it_now();
669  char *path = paths[i];
670  image im = load_image_color(path, 0, 0);
671  image r = letterbox_image(im, net->w, net->h);
672  float *predictions = network_predict(net, r.data);
673  if(net->hierarchy) hierarchy_predictions(predictions, net->outputs, net->hierarchy, 1, 1);
674  top_k(predictions, net->outputs, top, indexes);
675 
676  printf("%s", path);
677  for(j = 0; j < top; ++j){
678  printf("\t%d", indexes[j]);
679  }
680  printf("\n");
681 
682  free_image(im);
683  free_image(r);
684 
685  fprintf(stderr, "%lf seconds, %d images, %d total\n", what_time_is_it_now() - time, i+1, m);
686  }
687 }
688 
689 void test_classifier(char *datacfg, char *cfgfile, char *weightfile, int target_layer)
690 {
691  int curr = 0;
692  network *net = load_network(cfgfile, weightfile, 0);
693  srand(time(0));
694 
695  list *options = read_data_cfg(datacfg);
696 
697  char *test_list = option_find_str(options, "test", "data/test.list");
698  int classes = option_find_int(options, "classes", 2);
699 
700  list *plist = get_paths(test_list);
701 
702  char **paths = (char **)list_to_array(plist);
703  int m = plist->size;
704  free_list(plist);
705 
706  clock_t time;
707 
708  data val, buffer;
709 
710  load_args args = {0};
711  args.w = net->w;
712  args.h = net->h;
713  args.paths = paths;
714  args.classes = classes;
715  args.n = net->batch;
716  args.m = 0;
717  args.labels = 0;
718  args.d = &buffer;
720 
721  pthread_t load_thread = load_data_in_thread(args);
722  for(curr = net->batch; curr < m; curr += net->batch){
723  time=clock();
724 
725  pthread_join(load_thread, 0);
726  val = buffer;
727 
728  if(curr < m){
729  args.paths = paths + curr;
730  if (curr + net->batch > m) args.n = m - curr;
731  load_thread = load_data_in_thread(args);
732  }
733  fprintf(stderr, "Loaded: %d images in %lf seconds\n", val.X.rows, sec(clock()-time));
734 
735  time=clock();
736  matrix pred = network_predict_data(net, val);
737 
738  int i, j;
739  if (target_layer >= 0){
740  //layer l = net->layers[target_layer];
741  }
742 
743  for(i = 0; i < pred.rows; ++i){
744  printf("%s", paths[curr-net->batch+i]);
745  for(j = 0; j < pred.cols; ++j){
746  printf("\t%g", pred.vals[i][j]);
747  }
748  printf("\n");
749  }
750 
751  free_matrix(pred);
752 
753  fprintf(stderr, "%lf seconds, %d images, %d total\n", sec(clock()-time), val.X.rows, curr);
754  free_data(val);
755  }
756 }
757 
758 void file_output_classifier(char *datacfg, char *filename, char *weightfile, char *listfile)
759 {
760  int i,j;
761  network *net = load_network(filename, weightfile, 0);
762  set_batch_network(net, 1);
763  srand(time(0));
764 
765  list *options = read_data_cfg(datacfg);
766 
767  //char *label_list = option_find_str(options, "names", "data/labels.list");
768  int classes = option_find_int(options, "classes", 2);
769 
770  list *plist = get_paths(listfile);
771 
772  char **paths = (char **)list_to_array(plist);
773  int m = plist->size;
774  free_list(plist);
775 
776  for(i = 0; i < m; ++i){
777  image im = load_image_color(paths[i], 0, 0);
778  image resized = resize_min(im, net->w);
779  image crop = crop_image(resized, (resized.w - net->w)/2, (resized.h - net->h)/2, net->w, net->h);
780 
781  float *pred = network_predict(net, crop.data);
782  if(net->hierarchy) hierarchy_predictions(pred, net->outputs, net->hierarchy, 0, 1);
783 
784  if(resized.data != im.data) free_image(resized);
785  free_image(im);
786  free_image(crop);
787 
788  printf("%s", paths[i]);
789  for(j = 0; j < classes; ++j){
790  printf("\t%g", pred[j]);
791  }
792  printf("\n");
793  }
794 }
795 
796 
797 void threat_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename)
798 {
799 #ifdef OPENCV
800  float threat = 0;
801  float roll = .2;
802 
803  printf("Classifier Demo\n");
804  network *net = load_network(cfgfile, weightfile, 0);
805  set_batch_network(net, 1);
806  list *options = read_data_cfg(datacfg);
807 
808  srand(2222222);
809  CvCapture * cap;
810 
811  if(filename){
812  cap = cvCaptureFromFile(filename);
813  }else{
814  cap = cvCaptureFromCAM(cam_index);
815  }
816 
817  int top = option_find_int(options, "top", 1);
818 
819  char *name_list = option_find_str(options, "names", 0);
820  char **names = get_labels(name_list);
821 
822  int *indexes = calloc(top, sizeof(int));
823 
824  if(!cap) error("Couldn't connect to webcam.\n");
825  //cvNamedWindow("Threat", CV_WINDOW_NORMAL);
826  //cvResizeWindow("Threat", 512, 512);
827  float fps = 0;
828  int i;
829 
830  int count = 0;
831 
832  while(1){
833  ++count;
834  struct timeval tval_before, tval_after, tval_result;
835  gettimeofday(&tval_before, NULL);
836 
837  image in = get_image_from_stream(cap);
838  if(!in.data) break;
839  image in_s = resize_image(in, net->w, net->h);
840 
841  image out = in;
842  int x1 = out.w / 20;
843  int y1 = out.h / 20;
844  int x2 = 2*x1;
845  int y2 = out.h - out.h/20;
846 
847  int border = .01*out.h;
848  int h = y2 - y1 - 2*border;
849  int w = x2 - x1 - 2*border;
850 
851  float *predictions = network_predict(net, in_s.data);
852  float curr_threat = 0;
853  if(1){
854  curr_threat = predictions[0] * 0 +
855  predictions[1] * .6 +
856  predictions[2];
857  } else {
858  curr_threat = predictions[218] +
859  predictions[539] +
860  predictions[540] +
861  predictions[368] +
862  predictions[369] +
863  predictions[370];
864  }
865  threat = roll * curr_threat + (1-roll) * threat;
866 
867  draw_box_width(out, x2 + border, y1 + .02*h, x2 + .5 * w, y1 + .02*h + border, border, 0,0,0);
868  if(threat > .97) {
869  draw_box_width(out, x2 + .5 * w + border,
870  y1 + .02*h - 2*border,
871  x2 + .5 * w + 6*border,
872  y1 + .02*h + 3*border, 3*border, 1,0,0);
873  }
874  draw_box_width(out, x2 + .5 * w + border,
875  y1 + .02*h - 2*border,
876  x2 + .5 * w + 6*border,
877  y1 + .02*h + 3*border, .5*border, 0,0,0);
878  draw_box_width(out, x2 + border, y1 + .42*h, x2 + .5 * w, y1 + .42*h + border, border, 0,0,0);
879  if(threat > .57) {
880  draw_box_width(out, x2 + .5 * w + border,
881  y1 + .42*h - 2*border,
882  x2 + .5 * w + 6*border,
883  y1 + .42*h + 3*border, 3*border, 1,1,0);
884  }
885  draw_box_width(out, x2 + .5 * w + border,
886  y1 + .42*h - 2*border,
887  x2 + .5 * w + 6*border,
888  y1 + .42*h + 3*border, .5*border, 0,0,0);
889 
890  draw_box_width(out, x1, y1, x2, y2, border, 0,0,0);
891  for(i = 0; i < threat * h ; ++i){
892  float ratio = (float) i / h;
893  float r = (ratio < .5) ? (2*(ratio)) : 1;
894  float g = (ratio < .5) ? 1 : 1 - 2*(ratio - .5);
895  draw_box_width(out, x1 + border, y2 - border - i, x2 - border, y2 - border - i, 1, r, g, 0);
896  }
897  top_predictions(net, top, indexes);
898  char buff[256];
899  sprintf(buff, "/home/pjreddie/tmp/threat_%06d", count);
900  //save_image(out, buff);
901 
902  printf("\033[2J");
903  printf("\033[1;1H");
904  printf("\nFPS:%.0f\n",fps);
905 
906  for(i = 0; i < top; ++i){
907  int index = indexes[i];
908  printf("%.1f%%: %s\n", predictions[index]*100, names[index]);
909  }
910 
911  if(1){
912  show_image(out, "Threat", 10);
913  }
914  free_image(in_s);
915  free_image(in);
916 
917  gettimeofday(&tval_after, NULL);
918  timersub(&tval_after, &tval_before, &tval_result);
919  float curr = 1000000.f/((long int)tval_result.tv_usec);
920  fps = .9*fps + .1*curr;
921  }
922 #endif
923 }
924 
925 
926 void gun_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename)
927 {
928 #ifdef OPENCV
929  int bad_cats[] = {218, 539, 540, 1213, 1501, 1742, 1911, 2415, 4348, 19223, 368, 369, 370, 1133, 1200, 1306, 2122, 2301, 2537, 2823, 3179, 3596, 3639, 4489, 5107, 5140, 5289, 6240, 6631, 6762, 7048, 7171, 7969, 7984, 7989, 8824, 8927, 9915, 10270, 10448, 13401, 15205, 18358, 18894, 18895, 19249, 19697};
930 
931  printf("Classifier Demo\n");
932  network *net = load_network(cfgfile, weightfile, 0);
933  set_batch_network(net, 1);
934  list *options = read_data_cfg(datacfg);
935 
936  srand(2222222);
937  CvCapture * cap;
938 
939  if(filename){
940  cap = cvCaptureFromFile(filename);
941  }else{
942  cap = cvCaptureFromCAM(cam_index);
943  }
944 
945  int top = option_find_int(options, "top", 1);
946 
947  char *name_list = option_find_str(options, "names", 0);
948  char **names = get_labels(name_list);
949 
950  int *indexes = calloc(top, sizeof(int));
951 
952  if(!cap) error("Couldn't connect to webcam.\n");
953  cvNamedWindow("Threat Detection", CV_WINDOW_NORMAL);
954  cvResizeWindow("Threat Detection", 512, 512);
955  float fps = 0;
956  int i;
957 
958  while(1){
959  struct timeval tval_before, tval_after, tval_result;
960  gettimeofday(&tval_before, NULL);
961 
962  image in = get_image_from_stream(cap);
963  image in_s = resize_image(in, net->w, net->h);
964 
965  float *predictions = network_predict(net, in_s.data);
966  top_predictions(net, top, indexes);
967 
968  printf("\033[2J");
969  printf("\033[1;1H");
970 
971  int threat = 0;
972  for(i = 0; i < sizeof(bad_cats)/sizeof(bad_cats[0]); ++i){
973  int index = bad_cats[i];
974  if(predictions[index] > .01){
975  printf("Threat Detected!\n");
976  threat = 1;
977  break;
978  }
979  }
980  if(!threat) printf("Scanning...\n");
981  for(i = 0; i < sizeof(bad_cats)/sizeof(bad_cats[0]); ++i){
982  int index = bad_cats[i];
983  if(predictions[index] > .01){
984  printf("%s\n", names[index]);
985  }
986  }
987 
988  show_image(in, "Threat Detection", 10);
989  free_image(in_s);
990  free_image(in);
991 
992  gettimeofday(&tval_after, NULL);
993  timersub(&tval_after, &tval_before, &tval_result);
994  float curr = 1000000.f/((long int)tval_result.tv_usec);
995  fps = .9*fps + .1*curr;
996  }
997 #endif
998 }
999 
1000 void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename)
1001 {
1002 #ifdef OPENCV
1003  char *base = basecfg(cfgfile);
1004  image **alphabet = load_alphabet();
1005  printf("Classifier Demo\n");
1006  network *net = load_network(cfgfile, weightfile, 0);
1007  set_batch_network(net, 1);
1008  list *options = read_data_cfg(datacfg);
1009 
1010  srand(2222222);
1011  CvCapture * cap;
1012 
1013  int w = 1280;
1014  int h = 720;
1015 
1016  if(filename){
1017  cap = cvCaptureFromFile(filename);
1018  }else{
1019  cap = cvCaptureFromCAM(cam_index);
1020  }
1021 
1022  if(w){
1023  cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w);
1024  }
1025  if(h){
1026  cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h);
1027  }
1028 
1029  int top = option_find_int(options, "top", 1);
1030 
1031  char *label_list = option_find_str(options, "labels", 0);
1032  char *name_list = option_find_str(options, "names", label_list);
1033  char **names = get_labels(name_list);
1034 
1035  int *indexes = calloc(top, sizeof(int));
1036 
1037  if(!cap) error("Couldn't connect to webcam.\n");
1038  cvNamedWindow(base, CV_WINDOW_NORMAL);
1039  cvResizeWindow(base, 512, 512);
1040  float fps = 0;
1041  int i;
1042 
1043  while(1){
1044  struct timeval tval_before, tval_after, tval_result;
1045  gettimeofday(&tval_before, NULL);
1046 
1047  image in = get_image_from_stream(cap);
1048  //image in_s = resize_image(in, net->w, net->h);
1049  image in_s = letterbox_image(in, net->w, net->h);
1050 
1051  float *predictions = network_predict(net, in_s.data);
1052  if(net->hierarchy) hierarchy_predictions(predictions, net->outputs, net->hierarchy, 1, 1);
1053  top_predictions(net, top, indexes);
1054 
1055  printf("\033[2J");
1056  printf("\033[1;1H");
1057  printf("\nFPS:%.0f\n",fps);
1058 
1059  int lh = in.h*.03;
1060  int toph = 3*lh;
1061 
1062  float rgb[3] = {1,1,1};
1063  for(i = 0; i < top; ++i){
1064  printf("%d\n", toph);
1065  int index = indexes[i];
1066  printf("%.1f%%: %s\n", predictions[index]*100, names[index]);
1067 
1068  char buff[1024];
1069  sprintf(buff, "%3.1f%%: %s\n", predictions[index]*100, names[index]);
1070  image label = get_label(alphabet, buff, lh);
1071  draw_label(in, toph, lh, label, rgb);
1072  toph += 2*lh;
1073  free_image(label);
1074  }
1075 
1076  show_image(in, base, 10);
1077  free_image(in_s);
1078  free_image(in);
1079 
1080  gettimeofday(&tval_after, NULL);
1081  timersub(&tval_after, &tval_before, &tval_result);
1082  float curr = 1000000.f/((long int)tval_result.tv_usec);
1083  fps = .9*fps + .1*curr;
1084  }
1085 #endif
1086 }
1087 
1088 
1089 void run_classifier(int argc, char **argv)
1090 {
1091  if(argc < 4){
1092  fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
1093  return;
1094  }
1095 
1096  char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
1097  int ngpus;
1098  int *gpus = read_intlist(gpu_list, &ngpus, gpu_index);
1099 
1100 
1101  int cam_index = find_int_arg(argc, argv, "-c", 0);
1102  int top = find_int_arg(argc, argv, "-t", 0);
1103  int clear = find_arg(argc, argv, "-clear");
1104  char *data = argv[3];
1105  char *cfg = argv[4];
1106  char *weights = (argc > 5) ? argv[5] : 0;
1107  char *filename = (argc > 6) ? argv[6]: 0;
1108  char *layer_s = (argc > 7) ? argv[7]: 0;
1109  int layer = layer_s ? atoi(layer_s) : -1;
1110  if(0==strcmp(argv[2], "predict")) predict_classifier(data, cfg, weights, filename, top);
1111  else if(0==strcmp(argv[2], "fout")) file_output_classifier(data, cfg, weights, filename);
1112  else if(0==strcmp(argv[2], "try")) try_classifier(data, cfg, weights, filename, atoi(layer_s));
1113  else if(0==strcmp(argv[2], "train")) train_classifier(data, cfg, weights, gpus, ngpus, clear);
1114  else if(0==strcmp(argv[2], "demo")) demo_classifier(data, cfg, weights, cam_index, filename);
1115  else if(0==strcmp(argv[2], "gun")) gun_classifier(data, cfg, weights, cam_index, filename);
1116  else if(0==strcmp(argv[2], "threat")) threat_classifier(data, cfg, weights, cam_index, filename);
1117  else if(0==strcmp(argv[2], "test")) test_classifier(data, cfg, weights, layer);
1118  else if(0==strcmp(argv[2], "csv")) csv_classifier(data, cfg, weights);
1119  else if(0==strcmp(argv[2], "label")) label_classifier(data, cfg, weights);
1120  else if(0==strcmp(argv[2], "valid")) validate_classifier_single(data, cfg, weights);
1121  else if(0==strcmp(argv[2], "validmulti")) validate_classifier_multi(data, cfg, weights);
1122  else if(0==strcmp(argv[2], "valid10")) validate_classifier_10(data, cfg, weights);
1123  else if(0==strcmp(argv[2], "validcrop")) validate_classifier_crop(data, cfg, weights);
1124  else if(0==strcmp(argv[2], "validfull")) validate_classifier_full(data, cfg, weights);
1125 }
1126 
1127 
float min_ratio
Definition: darknet.h:472
float hue
Definition: darknet.h:576
float * scales
Definition: darknet.h:239
float decay
Definition: darknet.h:447
char ** paths
Definition: darknet.h:553
image resize_image(image im, int w, int h)
Definition: image.c:1351
int batch
Definition: darknet.h:436
int rows
Definition: darknet.h:533
pthread_t load_data_in_thread(load_args args)
Definition: data.c:1135
int find_arg(int argc, char *argv[], char *arg)
Definition: utils.c:120
void set_batch_network(network *net, int b)
Definition: network.c:339
void run_classifier(int argc, char **argv)
Definition: classifier.c:1089
int w
Definition: darknet.h:559
float learning_rate
Definition: darknet.h:445
int cols
Definition: darknet.h:533
int max_index(float *a, int n)
Definition: utils.c:619
float hue
Definition: darknet.h:478
float momentum
Definition: darknet.h:446
float * get_regression_values(char **labels, int n)
Definition: classifier.c:6
void free_data(data d)
Definition: data.c:665
int max
Definition: darknet.h:565
void threat_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename)
Definition: classifier.c:797
float * rolling_variance
Definition: darknet.h:259
int show_image(image p, const char *name, int ms)
Definition: image.c:575
char * find_char_arg(int argc, char **argv, char *arg, char *def)
Definition: utils.c:163
float aspect
Definition: darknet.h:573
char * basecfg(char *cfgfile)
Definition: utils.c:179
void change_leaves(tree *t, char *leaf_list)
Definition: tree.c:7
image resize_max(image im, int max)
Definition: image.c:985
void ** list_to_array(list *l)
Definition: list.c:82
size_t * seen
Definition: darknet.h:437
char * option_find_str(list *l, char *key, char *def)
Definition: option_list.c:104
float train_network(network *net, data d)
Definition: network.c:314
void top_k(float *a, int n, int k, int *index)
Definition: utils.c:237
int size
Definition: darknet.h:603
void free_list(list *l)
Definition: list.c:67
Definition: darknet.h:512
float * network_accuracies(network *net, data d, int n)
Definition: network.c:689
void csv_classifier(char *datacfg, char *cfgfile, char *weightfile)
Definition: classifier.c:649
void validate_classifier_multi(char *datacfg, char *cfg, char *weights)
Definition: classifier.c:420
void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top)
Definition: classifier.c:560
float max_ratio
Definition: darknet.h:471
int h
Definition: darknet.h:558
void free_network(network *net)
Definition: network.c:716
void flip_image(image a)
Definition: image.c:349
data_type type
Definition: darknet.h:580
void save_weights(network *net, char *filename)
Definition: parser.c:1080
void draw_box_width(image a, int x1, int y1, int x2, int y2, int w, float r, float g, float b)
Definition: image.c:202
int size
Definition: darknet.h:565
network_predict
Definition: darknet.py:79
float exposure
Definition: darknet.h:575
image ** load_alphabet()
Definition: image.c:223
image get_label(image **characters, char *string, int size)
Definition: image.c:132
int h
Definition: darknet.h:514
int max_batches
Definition: darknet.h:453
void validate_classifier_10(char *datacfg, char *filename, char *weightfile)
Definition: classifier.c:234
int resize_network(network *net, int w, int h)
Definition: network.c:358
image resize_min(image im, int min)
Definition: image.c:1001
letterbox_image
Definition: darknet.py:98
Definition: darknet.h:42
float aspect
Definition: darknet.h:475
int threads
Definition: darknet.h:552
tree * read_tree(char *filename)
Definition: tree.c:83
int option_find_int_quiet(list *l, char *key, int def)
Definition: option_list.c:120
int m
Definition: darknet.h:556
void gun_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename)
Definition: classifier.c:926
layer * layers
Definition: darknet.h:441
int * read_intlist(char *s, int *n, int d)
Definition: utils.c:36
void draw_label(image a, int r, int c, image label, const float *rgb)
Definition: image.c:149
data * d
Definition: darknet.h:577
free_image
Definition: darknet.py:95
image center_crop_image(image im, int w, int h)
Definition: image.c:796
int subdivisions
Definition: darknet.h:440
void axpy_cpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY)
Definition: blas.c:178
image load_image_color(char *filename, int w, int h)
Definition: image.c:1486
void train_classifier(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
Definition: classifier.c:18
int classes
Definition: darknet.h:566
float get_current_rate(network *net)
Definition: network.c:90
tree * hierarchy
Definition: darknet.h:581
float * output
Definition: darknet.h:246
float saturation
Definition: darknet.h:477
float * rolling_mean
Definition: darknet.h:258
void normalize_cpu(float *x, float *mean, float *variance, int batch, int filters, int spatial)
Definition: blas.c:147
float sec(clock_t clocks)
Definition: utils.c:232
float saturation
Definition: darknet.h:574
void file_output_classifier(char *datacfg, char *filename, char *weightfile, char *listfile)
Definition: classifier.c:758
void label_classifier(char *datacfg, char *filename, char *weightfile)
Definition: classifier.c:614
int find_int_arg(int argc, char **argv, char *arg, int def)
Definition: utils.c:133
network * load_network(char *cfg, char *weights, int clear)
Definition: network.c:53
char ** get_labels(char *filename)
Definition: data.c:657
void validate_classifier_single(char *datacfg, char *filename, char *weightfile)
Definition: classifier.c:361
int random
Definition: darknet.h:479
int n
Definition: darknet.h:555
image crop_image(image im, int dx, int dy, int w, int h)
Definition: image.c:861
matrix network_predict_data(network *net, data test)
Definition: network.c:616
void free_matrix(matrix m)
Definition: matrix.c:10
void * load_thread(void *ptr)
Definition: data.c:1090
int w
Definition: darknet.h:513
void cuda_set_device(int n)
Definition: cuda.c:176
Definition: darknet.h:602
void validate_classifier_crop(char *datacfg, char *filename, char *weightfile)
Definition: classifier.c:170
int min
Definition: darknet.h:565
int c
Definition: darknet.h:140
list * read_data_cfg(char *filename)
Definition: option_list.c:7
char ** labels
Definition: darknet.h:557
matrix X
Definition: darknet.h:540
tree * hierarchy
Definition: darknet.h:482
void try_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int layer_num)
Definition: classifier.c:482
int gpu_index
Definition: cuda.c:1
int outputs
Definition: darknet.h:465
void demo_classifier(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename)
Definition: classifier.c:1000
size_t get_current_batch(network *net)
Definition: network.c:63
float ** vals
Definition: darknet.h:534
int h
Definition: darknet.h:468
void test_classifier(char *datacfg, char *cfgfile, char *weightfile, int target_layer)
Definition: classifier.c:689
void validate_classifier_full(char *datacfg, char *filename, char *weightfile)
Definition: classifier.c:303
float angle
Definition: darknet.h:572
list * get_paths(char *filename)
Definition: data.c:12
void top_predictions(network *net, int n, int *index)
Definition: network.c:491
int outputs
Definition: darknet.h:135
free_ptrs
Definition: darknet.py:76
pthread_t load_data(load_args args)
Definition: data.c:1180
void error(const char *s)
Definition: utils.c:253
int option_find_int(list *l, char *key, int def)
Definition: option_list.c:112
int w
Definition: darknet.h:468
list classes
Definition: voc_label.py:9
Definition: darknet.h:538
void hierarchy_predictions(float *predictions, int n, tree *hier, int only_leaves, int stride)
Definition: tree.c:37
double what_time_is_it_now()
Definition: utils.c:27
Definition: darknet.h:119
float * data
Definition: darknet.h:516
float exposure
Definition: darknet.h:476
float angle
Definition: darknet.h:474