darknet  v3
detector.c
Go to the documentation of this file.
1 #include "darknet.h"
2 
3 static int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90};
4 
5 
6 void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
7 {
8  list *options = read_data_cfg(datacfg);
9  char *train_images = option_find_str(options, "train", "data/train.list");
10  char *backup_directory = option_find_str(options, "backup", "/backup/");
11 
12  srand(time(0));
13  char *base = basecfg(cfgfile);
14  printf("%s\n", base);
15  float avg_loss = -1;
16  network **nets = calloc(ngpus, sizeof(network));
17 
18  srand(time(0));
19  int seed = rand();
20  int i;
21  for(i = 0; i < ngpus; ++i){
22  srand(seed);
23 #ifdef GPU
24  cuda_set_device(gpus[i]);
25 #endif
26  nets[i] = load_network(cfgfile, weightfile, clear);
27  nets[i]->learning_rate *= ngpus;
28  }
29  srand(time(0));
30  network *net = nets[0];
31 
32  int imgs = net->batch * net->subdivisions * ngpus;
33  printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
34  data train, buffer;
35 
36  layer l = net->layers[net->n - 1];
37 
38  int classes = l.classes;
39  float jitter = l.jitter;
40 
41  list *plist = get_paths(train_images);
42  //int N = plist->size;
43  char **paths = (char **)list_to_array(plist);
44 
45  load_args args = get_base_args(net);
46  args.coords = l.coords;
47  args.paths = paths;
48  args.n = imgs;
49  args.m = plist->size;
50  args.classes = classes;
51  args.jitter = jitter;
52  args.num_boxes = l.max_boxes;
53  args.d = &buffer;
54  args.type = DETECTION_DATA;
55  //args.type = INSTANCE_DATA;
56  args.threads = 64;
57 
58  pthread_t load_thread = load_data(args);
59  double time;
60  int count = 0;
61  //while(i*imgs < N*120){
62  while(get_current_batch(net) < net->max_batches){
63  if(l.random && count++%10 == 0){
64  printf("Resizing\n");
65  int dim = (rand() % 10 + 10) * 32;
66  if (get_current_batch(net)+200 > net->max_batches) dim = 608;
67  //int dim = (rand() % 4 + 16) * 32;
68  printf("%d\n", dim);
69  args.w = dim;
70  args.h = dim;
71 
72  pthread_join(load_thread, 0);
73  train = buffer;
74  free_data(train);
75  load_thread = load_data(args);
76 
77  #pragma omp parallel for
78  for(i = 0; i < ngpus; ++i){
79  resize_network(nets[i], dim, dim);
80  }
81  net = nets[0];
82  }
83  time=what_time_is_it_now();
84  pthread_join(load_thread, 0);
85  train = buffer;
86  load_thread = load_data(args);
87 
88  /*
89  int k;
90  for(k = 0; k < l.max_boxes; ++k){
91  box b = float_to_box(train.y.vals[10] + 1 + k*5);
92  if(!b.x) break;
93  printf("loaded: %f %f %f %f\n", b.x, b.y, b.w, b.h);
94  }
95  */
96  /*
97  int zz;
98  for(zz = 0; zz < train.X.cols; ++zz){
99  image im = float_to_image(net->w, net->h, 3, train.X.vals[zz]);
100  int k;
101  for(k = 0; k < l.max_boxes; ++k){
102  box b = float_to_box(train.y.vals[zz] + k*5, 1);
103  printf("%f %f %f %f\n", b.x, b.y, b.w, b.h);
104  draw_bbox(im, b, 1, 1,0,0);
105  }
106  show_image(im, "truth11");
107  cvWaitKey(0);
108  save_image(im, "truth11");
109  }
110  */
111 
112  printf("Loaded: %lf seconds\n", what_time_is_it_now()-time);
113 
114  time=what_time_is_it_now();
115  float loss = 0;
116 #ifdef GPU
117  if(ngpus == 1){
118  loss = train_network(net, train);
119  } else {
120  loss = train_networks(nets, ngpus, train, 4);
121  }
122 #else
123  loss = train_network(net, train);
124 #endif
125  if (avg_loss < 0) avg_loss = loss;
126  avg_loss = avg_loss*.9 + loss*.1;
127 
128  i = get_current_batch(net);
129  printf("%ld: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, i*imgs);
130  if(i%100==0){
131 #ifdef GPU
132  if(ngpus != 1) sync_nets(nets, ngpus, 0);
133 #endif
134  char buff[256];
135  sprintf(buff, "%s/%s.backup", backup_directory, base);
136  save_weights(net, buff);
137  }
138  if(i%10000==0 || (i < 1000 && i%100 == 0)){
139 #ifdef GPU
140  if(ngpus != 1) sync_nets(nets, ngpus, 0);
141 #endif
142  char buff[256];
143  sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
144  save_weights(net, buff);
145  }
146  free_data(train);
147  }
148 #ifdef GPU
149  if(ngpus != 1) sync_nets(nets, ngpus, 0);
150 #endif
151  char buff[256];
152  sprintf(buff, "%s/%s_final.weights", backup_directory, base);
153  save_weights(net, buff);
154 }
155 
156 
157 static int get_coco_image_id(char *filename)
158 {
159  char *p = strrchr(filename, '/');
160  char *c = strrchr(filename, '_');
161  if(c) p = c;
162  return atoi(p+1);
163 }
164 
165 static void print_cocos(FILE *fp, char *image_path, detection *dets, int num_boxes, int classes, int w, int h)
166 {
167  int i, j;
168  int image_id = get_coco_image_id(image_path);
169  for(i = 0; i < num_boxes; ++i){
170  float xmin = dets[i].bbox.x - dets[i].bbox.w/2.;
171  float xmax = dets[i].bbox.x + dets[i].bbox.w/2.;
172  float ymin = dets[i].bbox.y - dets[i].bbox.h/2.;
173  float ymax = dets[i].bbox.y + dets[i].bbox.h/2.;
174 
175  if (xmin < 0) xmin = 0;
176  if (ymin < 0) ymin = 0;
177  if (xmax > w) xmax = w;
178  if (ymax > h) ymax = h;
179 
180  float bx = xmin;
181  float by = ymin;
182  float bw = xmax - xmin;
183  float bh = ymax - ymin;
184 
185  for(j = 0; j < classes; ++j){
186  if (dets[i].prob[j]) fprintf(fp, "{\"image_id\":%d, \"category_id\":%d, \"bbox\":[%f, %f, %f, %f], \"score\":%f},\n", image_id, coco_ids[j], bx, by, bw, bh, dets[i].prob[j]);
187  }
188  }
189 }
190 
191 void print_detector_detections(FILE **fps, char *id, detection *dets, int total, int classes, int w, int h)
192 {
193  int i, j;
194  for(i = 0; i < total; ++i){
195  float xmin = dets[i].bbox.x - dets[i].bbox.w/2. + 1;
196  float xmax = dets[i].bbox.x + dets[i].bbox.w/2. + 1;
197  float ymin = dets[i].bbox.y - dets[i].bbox.h/2. + 1;
198  float ymax = dets[i].bbox.y + dets[i].bbox.h/2. + 1;
199 
200  if (xmin < 1) xmin = 1;
201  if (ymin < 1) ymin = 1;
202  if (xmax > w) xmax = w;
203  if (ymax > h) ymax = h;
204 
205  for(j = 0; j < classes; ++j){
206  if (dets[i].prob[j]) fprintf(fps[j], "%s %f %f %f %f %f\n", id, dets[i].prob[j],
207  xmin, ymin, xmax, ymax);
208  }
209  }
210 }
211 
212 void print_imagenet_detections(FILE *fp, int id, detection *dets, int total, int classes, int w, int h)
213 {
214  int i, j;
215  for(i = 0; i < total; ++i){
216  float xmin = dets[i].bbox.x - dets[i].bbox.w/2.;
217  float xmax = dets[i].bbox.x + dets[i].bbox.w/2.;
218  float ymin = dets[i].bbox.y - dets[i].bbox.h/2.;
219  float ymax = dets[i].bbox.y + dets[i].bbox.h/2.;
220 
221  if (xmin < 0) xmin = 0;
222  if (ymin < 0) ymin = 0;
223  if (xmax > w) xmax = w;
224  if (ymax > h) ymax = h;
225 
226  for(j = 0; j < classes; ++j){
227  int class = j;
228  if (dets[i].prob[class]) fprintf(fp, "%d %d %f %f %f %f %f\n", id, j+1, dets[i].prob[class],
229  xmin, ymin, xmax, ymax);
230  }
231  }
232 }
233 
234 void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char *outfile)
235 {
236  int j;
237  list *options = read_data_cfg(datacfg);
238  char *valid_images = option_find_str(options, "valid", "data/train.list");
239  char *name_list = option_find_str(options, "names", "data/names.list");
240  char *prefix = option_find_str(options, "results", "results");
241  char **names = get_labels(name_list);
242  char *mapf = option_find_str(options, "map", 0);
243  int *map = 0;
244  if (mapf) map = read_map(mapf);
245 
246  network *net = load_network(cfgfile, weightfile, 0);
247  set_batch_network(net, 2);
248  fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
249  srand(time(0));
250 
251  list *plist = get_paths(valid_images);
252  char **paths = (char **)list_to_array(plist);
253 
254  layer l = net->layers[net->n-1];
255  int classes = l.classes;
256 
257  char buff[1024];
258  char *type = option_find_str(options, "eval", "voc");
259  FILE *fp = 0;
260  FILE **fps = 0;
261  int coco = 0;
262  int imagenet = 0;
263  if(0==strcmp(type, "coco")){
264  if(!outfile) outfile = "coco_results";
265  snprintf(buff, 1024, "%s/%s.json", prefix, outfile);
266  fp = fopen(buff, "w");
267  fprintf(fp, "[\n");
268  coco = 1;
269  } else if(0==strcmp(type, "imagenet")){
270  if(!outfile) outfile = "imagenet-detection";
271  snprintf(buff, 1024, "%s/%s.txt", prefix, outfile);
272  fp = fopen(buff, "w");
273  imagenet = 1;
274  classes = 200;
275  } else {
276  if(!outfile) outfile = "comp4_det_test_";
277  fps = calloc(classes, sizeof(FILE *));
278  for(j = 0; j < classes; ++j){
279  snprintf(buff, 1024, "%s/%s%s.txt", prefix, outfile, names[j]);
280  fps[j] = fopen(buff, "w");
281  }
282  }
283 
284  int m = plist->size;
285  int i=0;
286  int t;
287 
288  float thresh = .005;
289  float nms = .45;
290 
291  int nthreads = 4;
292  image *val = calloc(nthreads, sizeof(image));
293  image *val_resized = calloc(nthreads, sizeof(image));
294  image *buf = calloc(nthreads, sizeof(image));
295  image *buf_resized = calloc(nthreads, sizeof(image));
296  pthread_t *thr = calloc(nthreads, sizeof(pthread_t));
297 
298  image input = make_image(net->w, net->h, net->c*2);
299 
300  load_args args = {0};
301  args.w = net->w;
302  args.h = net->h;
303  //args.type = IMAGE_DATA;
304  args.type = LETTERBOX_DATA;
305 
306  for(t = 0; t < nthreads; ++t){
307  args.path = paths[i+t];
308  args.im = &buf[t];
309  args.resized = &buf_resized[t];
310  thr[t] = load_data_in_thread(args);
311  }
312  double start = what_time_is_it_now();
313  for(i = nthreads; i < m+nthreads; i += nthreads){
314  fprintf(stderr, "%d\n", i);
315  for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
316  pthread_join(thr[t], 0);
317  val[t] = buf[t];
318  val_resized[t] = buf_resized[t];
319  }
320  for(t = 0; t < nthreads && i+t < m; ++t){
321  args.path = paths[i+t];
322  args.im = &buf[t];
323  args.resized = &buf_resized[t];
324  thr[t] = load_data_in_thread(args);
325  }
326  for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
327  char *path = paths[i+t-nthreads];
328  char *id = basecfg(path);
329  copy_cpu(net->w*net->h*net->c, val_resized[t].data, 1, input.data, 1);
330  flip_image(val_resized[t]);
331  copy_cpu(net->w*net->h*net->c, val_resized[t].data, 1, input.data + net->w*net->h*net->c, 1);
332 
333  network_predict(net, input.data);
334  int w = val[t].w;
335  int h = val[t].h;
336  int num = 0;
337  detection *dets = get_network_boxes(net, w, h, thresh, .5, map, 0, &num);
338  if (nms) do_nms_sort(dets, num, classes, nms);
339  if (coco){
340  print_cocos(fp, path, dets, num, classes, w, h);
341  } else if (imagenet){
342  print_imagenet_detections(fp, i+t-nthreads+1, dets, num, classes, w, h);
343  } else {
344  print_detector_detections(fps, id, dets, num, classes, w, h);
345  }
346  free_detections(dets, num);
347  free(id);
348  free_image(val[t]);
349  free_image(val_resized[t]);
350  }
351  }
352  for(j = 0; j < classes; ++j){
353  if(fps) fclose(fps[j]);
354  }
355  if(coco){
356  fseek(fp, -2, SEEK_CUR);
357  fprintf(fp, "\n]\n");
358  fclose(fp);
359  }
360  fprintf(stderr, "Total Detection Time: %f Seconds\n", what_time_is_it_now() - start);
361 }
362 
363 
364 void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *outfile)
365 {
366  int j;
367  list *options = read_data_cfg(datacfg);
368  char *valid_images = option_find_str(options, "valid", "data/train.list");
369  char *name_list = option_find_str(options, "names", "data/names.list");
370  char *prefix = option_find_str(options, "results", "results");
371  char **names = get_labels(name_list);
372  char *mapf = option_find_str(options, "map", 0);
373  int *map = 0;
374  if (mapf) map = read_map(mapf);
375 
376  network *net = load_network(cfgfile, weightfile, 0);
377  set_batch_network(net, 1);
378  fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
379  srand(time(0));
380 
381  list *plist = get_paths(valid_images);
382  char **paths = (char **)list_to_array(plist);
383 
384  layer l = net->layers[net->n-1];
385  int classes = l.classes;
386 
387  char buff[1024];
388  char *type = option_find_str(options, "eval", "voc");
389  FILE *fp = 0;
390  FILE **fps = 0;
391  int coco = 0;
392  int imagenet = 0;
393  if(0==strcmp(type, "coco")){
394  if(!outfile) outfile = "coco_results";
395  snprintf(buff, 1024, "%s/%s.json", prefix, outfile);
396  fp = fopen(buff, "w");
397  fprintf(fp, "[\n");
398  coco = 1;
399  } else if(0==strcmp(type, "imagenet")){
400  if(!outfile) outfile = "imagenet-detection";
401  snprintf(buff, 1024, "%s/%s.txt", prefix, outfile);
402  fp = fopen(buff, "w");
403  imagenet = 1;
404  classes = 200;
405  } else {
406  if(!outfile) outfile = "comp4_det_test_";
407  fps = calloc(classes, sizeof(FILE *));
408  for(j = 0; j < classes; ++j){
409  snprintf(buff, 1024, "%s/%s%s.txt", prefix, outfile, names[j]);
410  fps[j] = fopen(buff, "w");
411  }
412  }
413 
414 
415  int m = plist->size;
416  int i=0;
417  int t;
418 
419  float thresh = .005;
420  float nms = .45;
421 
422  int nthreads = 4;
423  image *val = calloc(nthreads, sizeof(image));
424  image *val_resized = calloc(nthreads, sizeof(image));
425  image *buf = calloc(nthreads, sizeof(image));
426  image *buf_resized = calloc(nthreads, sizeof(image));
427  pthread_t *thr = calloc(nthreads, sizeof(pthread_t));
428 
429  load_args args = {0};
430  args.w = net->w;
431  args.h = net->h;
432  //args.type = IMAGE_DATA;
433  args.type = LETTERBOX_DATA;
434 
435  for(t = 0; t < nthreads; ++t){
436  args.path = paths[i+t];
437  args.im = &buf[t];
438  args.resized = &buf_resized[t];
439  thr[t] = load_data_in_thread(args);
440  }
441  double start = what_time_is_it_now();
442  for(i = nthreads; i < m+nthreads; i += nthreads){
443  fprintf(stderr, "%d\n", i);
444  for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
445  pthread_join(thr[t], 0);
446  val[t] = buf[t];
447  val_resized[t] = buf_resized[t];
448  }
449  for(t = 0; t < nthreads && i+t < m; ++t){
450  args.path = paths[i+t];
451  args.im = &buf[t];
452  args.resized = &buf_resized[t];
453  thr[t] = load_data_in_thread(args);
454  }
455  for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
456  char *path = paths[i+t-nthreads];
457  char *id = basecfg(path);
458  float *X = val_resized[t].data;
459  network_predict(net, X);
460  int w = val[t].w;
461  int h = val[t].h;
462  int nboxes = 0;
463  detection *dets = get_network_boxes(net, w, h, thresh, .5, map, 0, &nboxes);
464  if (nms) do_nms_sort(dets, nboxes, classes, nms);
465  if (coco){
466  print_cocos(fp, path, dets, nboxes, classes, w, h);
467  } else if (imagenet){
468  print_imagenet_detections(fp, i+t-nthreads+1, dets, nboxes, classes, w, h);
469  } else {
470  print_detector_detections(fps, id, dets, nboxes, classes, w, h);
471  }
472  free_detections(dets, nboxes);
473  free(id);
474  free_image(val[t]);
475  free_image(val_resized[t]);
476  }
477  }
478  for(j = 0; j < classes; ++j){
479  if(fps) fclose(fps[j]);
480  }
481  if(coco){
482  fseek(fp, -2, SEEK_CUR);
483  fprintf(fp, "\n]\n");
484  fclose(fp);
485  }
486  fprintf(stderr, "Total Detection Time: %f Seconds\n", what_time_is_it_now() - start);
487 }
488 
489 void validate_detector_recall(char *cfgfile, char *weightfile)
490 {
491  network *net = load_network(cfgfile, weightfile, 0);
492  set_batch_network(net, 1);
493  fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
494  srand(time(0));
495 
496  list *plist = get_paths("data/coco_val_5k.list");
497  char **paths = (char **)list_to_array(plist);
498 
499  layer l = net->layers[net->n-1];
500 
501  int j, k;
502 
503  int m = plist->size;
504  int i=0;
505 
506  float thresh = .001;
507  float iou_thresh = .5;
508  float nms = .4;
509 
510  int total = 0;
511  int correct = 0;
512  int proposals = 0;
513  float avg_iou = 0;
514 
515  for(i = 0; i < m; ++i){
516  char *path = paths[i];
517  image orig = load_image_color(path, 0, 0);
518  image sized = resize_image(orig, net->w, net->h);
519  char *id = basecfg(path);
520  network_predict(net, sized.data);
521  int nboxes = 0;
522  detection *dets = get_network_boxes(net, sized.w, sized.h, thresh, .5, 0, 1, &nboxes);
523  if (nms) do_nms_obj(dets, nboxes, 1, nms);
524 
525  char labelpath[4096];
526  find_replace(path, "images", "labels", labelpath);
527  find_replace(labelpath, "JPEGImages", "labels", labelpath);
528  find_replace(labelpath, ".jpg", ".txt", labelpath);
529  find_replace(labelpath, ".JPEG", ".txt", labelpath);
530 
531  int num_labels = 0;
532  box_label *truth = read_boxes(labelpath, &num_labels);
533  for(k = 0; k < nboxes; ++k){
534  if(dets[k].objectness > thresh){
535  ++proposals;
536  }
537  }
538  for (j = 0; j < num_labels; ++j) {
539  ++total;
540  box t = {truth[j].x, truth[j].y, truth[j].w, truth[j].h};
541  float best_iou = 0;
542  for(k = 0; k < l.w*l.h*l.n; ++k){
543  float iou = box_iou(dets[k].bbox, t);
544  if(dets[k].objectness > thresh && iou > best_iou){
545  best_iou = iou;
546  }
547  }
548  avg_iou += best_iou;
549  if(best_iou > iou_thresh){
550  ++correct;
551  }
552  }
553 
554  fprintf(stderr, "%5d %5d %5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\n", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total);
555  free(id);
556  free_image(orig);
557  free_image(sized);
558  }
559 }
560 
561 
562 void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen)
563 {
564  list *options = read_data_cfg(datacfg);
565  char *name_list = option_find_str(options, "names", "data/names.list");
566  char **names = get_labels(name_list);
567 
568  image **alphabet = load_alphabet();
569  network *net = load_network(cfgfile, weightfile, 0);
570  set_batch_network(net, 1);
571  srand(2222222);
572  double time;
573  char buff[256];
574  char *input = buff;
575  float nms=.45;
576  while(1){
577  if(filename){
578  strncpy(input, filename, 256);
579  } else {
580  printf("Enter Image Path: ");
581  fflush(stdout);
582  input = fgets(input, 256, stdin);
583  if(!input) return;
584  strtok(input, "\n");
585  }
586  image im = load_image_color(input,0,0);
587  image sized = letterbox_image(im, net->w, net->h);
588  //image sized = resize_image(im, net->w, net->h);
589  //image sized2 = resize_max(im, net->w);
590  //image sized = crop_image(sized2, -((net->w - sized2.w)/2), -((net->h - sized2.h)/2), net->w, net->h);
591  //resize_network(net, sized.w, sized.h);
592  layer l = net->layers[net->n-1];
593 
594 
595  float *X = sized.data;
596  time=what_time_is_it_now();
597  network_predict(net, X);
598  printf("%s: Predicted in %f seconds.\n", input, what_time_is_it_now()-time);
599  int nboxes = 0;
600  detection *dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes);
601  //printf("%d\n", nboxes);
602  //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);
603  if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
604  draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes);
605  free_detections(dets, nboxes);
606  if(outfile){
607  save_image(im, outfile);
608  }
609  else{
610  save_image(im, "predictions");
611 #ifdef OPENCV
612  cvNamedWindow("predictions", CV_WINDOW_NORMAL);
613  if(fullscreen){
614  cvSetWindowProperty("predictions", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
615  }
616  show_image(im, "predictions", 0);
617 #endif
618  }
619 
620  free_image(im);
621  free_image(sized);
622  if (filename) break;
623  }
624 }
625 
626 /*
627 void censor_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename, int class, float thresh, int skip)
628 {
629 #ifdef OPENCV
630  char *base = basecfg(cfgfile);
631  network *net = load_network(cfgfile, weightfile, 0);
632  set_batch_network(net, 1);
633 
634  srand(2222222);
635  CvCapture * cap;
636 
637  int w = 1280;
638  int h = 720;
639 
640  if(filename){
641  cap = cvCaptureFromFile(filename);
642  }else{
643  cap = cvCaptureFromCAM(cam_index);
644  }
645 
646  if(w){
647  cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w);
648  }
649  if(h){
650  cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h);
651  }
652 
653  if(!cap) error("Couldn't connect to webcam.\n");
654  cvNamedWindow(base, CV_WINDOW_NORMAL);
655  cvResizeWindow(base, 512, 512);
656  float fps = 0;
657  int i;
658  float nms = .45;
659 
660  while(1){
661  image in = get_image_from_stream(cap);
662  //image in_s = resize_image(in, net->w, net->h);
663  image in_s = letterbox_image(in, net->w, net->h);
664  layer l = net->layers[net->n-1];
665 
666  float *X = in_s.data;
667  network_predict(net, X);
668  int nboxes = 0;
669  detection *dets = get_network_boxes(net, in.w, in.h, thresh, 0, 0, 0, &nboxes);
670  //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);
671  if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
672 
673  for(i = 0; i < nboxes; ++i){
674  if(dets[i].prob[class] > thresh){
675  box b = dets[i].bbox;
676  int left = b.x-b.w/2.;
677  int top = b.y-b.h/2.;
678  censor_image(in, left, top, b.w, b.h);
679  }
680  }
681  show_image(in, base);
682  cvWaitKey(10);
683  free_detections(dets, nboxes);
684 
685 
686  free_image(in_s);
687  free_image(in);
688 
689 
690  float curr = 0;
691  fps = .9*fps + .1*curr;
692  for(i = 0; i < skip; ++i){
693  image in = get_image_from_stream(cap);
694  free_image(in);
695  }
696  }
697  #endif
698 }
699 
700 void extract_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename, int class, float thresh, int skip)
701 {
702 #ifdef OPENCV
703  char *base = basecfg(cfgfile);
704  network *net = load_network(cfgfile, weightfile, 0);
705  set_batch_network(net, 1);
706 
707  srand(2222222);
708  CvCapture * cap;
709 
710  int w = 1280;
711  int h = 720;
712 
713  if(filename){
714  cap = cvCaptureFromFile(filename);
715  }else{
716  cap = cvCaptureFromCAM(cam_index);
717  }
718 
719  if(w){
720  cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w);
721  }
722  if(h){
723  cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h);
724  }
725 
726  if(!cap) error("Couldn't connect to webcam.\n");
727  cvNamedWindow(base, CV_WINDOW_NORMAL);
728  cvResizeWindow(base, 512, 512);
729  float fps = 0;
730  int i;
731  int count = 0;
732  float nms = .45;
733 
734  while(1){
735  image in = get_image_from_stream(cap);
736  //image in_s = resize_image(in, net->w, net->h);
737  image in_s = letterbox_image(in, net->w, net->h);
738  layer l = net->layers[net->n-1];
739 
740  show_image(in, base);
741 
742  int nboxes = 0;
743  float *X = in_s.data;
744  network_predict(net, X);
745  detection *dets = get_network_boxes(net, in.w, in.h, thresh, 0, 0, 1, &nboxes);
746  //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);
747  if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
748 
749  for(i = 0; i < nboxes; ++i){
750  if(dets[i].prob[class] > thresh){
751  box b = dets[i].bbox;
752  int size = b.w*in.w > b.h*in.h ? b.w*in.w : b.h*in.h;
753  int dx = b.x*in.w-size/2.;
754  int dy = b.y*in.h-size/2.;
755  image bim = crop_image(in, dx, dy, size, size);
756  char buff[2048];
757  sprintf(buff, "results/extract/%07d", count);
758  ++count;
759  save_image(bim, buff);
760  free_image(bim);
761  }
762  }
763  free_detections(dets, nboxes);
764 
765 
766  free_image(in_s);
767  free_image(in);
768 
769 
770  float curr = 0;
771  fps = .9*fps + .1*curr;
772  for(i = 0; i < skip; ++i){
773  image in = get_image_from_stream(cap);
774  free_image(in);
775  }
776  }
777  #endif
778 }
779 */
780 
781 /*
782 void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, detection *dets)
783 {
784  network_predict_image(net, im);
785  layer l = net->layers[net->n-1];
786  int nboxes = num_boxes(net);
787  fill_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 0, dets);
788  if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
789 }
790 */
791 
792 void run_detector(int argc, char **argv)
793 {
794  char *prefix = find_char_arg(argc, argv, "-prefix", 0);
795  float thresh = find_float_arg(argc, argv, "-thresh", .5);
796  float hier_thresh = find_float_arg(argc, argv, "-hier", .5);
797  int cam_index = find_int_arg(argc, argv, "-c", 0);
798  int frame_skip = find_int_arg(argc, argv, "-s", 0);
799  int avg = find_int_arg(argc, argv, "-avg", 3);
800  if(argc < 4){
801  fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
802  return;
803  }
804  char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
805  char *outfile = find_char_arg(argc, argv, "-out", 0);
806  int *gpus = 0;
807  int gpu = 0;
808  int ngpus = 0;
809  if(gpu_list){
810  printf("%s\n", gpu_list);
811  int len = strlen(gpu_list);
812  ngpus = 1;
813  int i;
814  for(i = 0; i < len; ++i){
815  if (gpu_list[i] == ',') ++ngpus;
816  }
817  gpus = calloc(ngpus, sizeof(int));
818  for(i = 0; i < ngpus; ++i){
819  gpus[i] = atoi(gpu_list);
820  gpu_list = strchr(gpu_list, ',')+1;
821  }
822  } else {
823  gpu = gpu_index;
824  gpus = &gpu;
825  ngpus = 1;
826  }
827 
828  int clear = find_arg(argc, argv, "-clear");
829  int fullscreen = find_arg(argc, argv, "-fullscreen");
830  int width = find_int_arg(argc, argv, "-w", 0);
831  int height = find_int_arg(argc, argv, "-h", 0);
832  int fps = find_int_arg(argc, argv, "-fps", 0);
833  //int class = find_int_arg(argc, argv, "-class", 0);
834 
835  char *datacfg = argv[3];
836  char *cfg = argv[4];
837  char *weights = (argc > 5) ? argv[5] : 0;
838  char *filename = (argc > 6) ? argv[6]: 0;
839  if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile, fullscreen);
840  else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear);
841  else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile);
842  else if(0==strcmp(argv[2], "valid2")) validate_detector_flip(datacfg, cfg, weights, outfile);
843  else if(0==strcmp(argv[2], "recall")) validate_detector_recall(cfg, weights);
844  else if(0==strcmp(argv[2], "demo")) {
845  list *options = read_data_cfg(datacfg);
846  int classes = option_find_int(options, "classes", 20);
847  char *name_list = option_find_str(options, "names", "data/names.list");
848  char **names = get_labels(name_list);
849  demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, avg, hier_thresh, width, height, fps, fullscreen);
850  }
851  //else if(0==strcmp(argv[2], "extract")) extract_detector(datacfg, cfg, weights, cam_index, filename, class, thresh, frame_skip);
852  //else if(0==strcmp(argv[2], "censor")) censor_detector(datacfg, cfg, weights, cam_index, filename, class, thresh, frame_skip);
853 }
int max_boxes
Definition: darknet.h:143
void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
Definition: detector.c:6
free_detections
Definition: darknet.py:73
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
make_image
Definition: darknet.py:61
image * im
Definition: darknet.h:578
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
load_args get_base_args(network *net)
Definition: network.c:35
int w
Definition: darknet.h:140
int coords
Definition: darknet.h:570
void set_batch_network(network *net, int b)
Definition: network.c:339
int n
Definition: darknet.h:142
box_label * read_boxes(char *filename, int *n)
Definition: data.c:139
int w
Definition: darknet.h:559
float learning_rate
Definition: darknet.h:445
void validate_detector_recall(char *cfgfile, char *weightfile)
Definition: detector.c:489
float momentum
Definition: darknet.h:446
float h
Definition: darknet.h:520
void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, int avg, float hier_thresh, int w, int h, int fps, int fullscreen)
Definition: demo.c:359
void free_data(data d)
Definition: data.c:665
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
char * basecfg(char *cfgfile)
Definition: utils.c:179
void ** list_to_array(list *l)
Definition: list.c:82
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
int size
Definition: darknet.h:603
Definition: darknet.h:512
void save_image(image p, const char *name)
Definition: image.c:717
void run_detector(int argc, char **argv)
Definition: detector.c:792
int get_coco_image_id(char *filename)
Definition: coco.c:122
int h
Definition: darknet.h:558
float jitter
Definition: darknet.h:571
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
do_nms_sort
Definition: darknet.py:92
network_predict
Definition: darknet.py:79
float y
Definition: darknet.h:586
image ** load_alphabet()
Definition: image.c:223
float w
Definition: darknet.h:520
int h
Definition: darknet.h:514
int max_batches
Definition: darknet.h:453
int resize_network(network *net, int w, int h)
Definition: network.c:358
letterbox_image
Definition: darknet.py:98
void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen)
Definition: detector.c:562
float x
Definition: darknet.h:520
int threads
Definition: darknet.h:552
int num_boxes
Definition: darknet.h:564
int m
Definition: darknet.h:556
layer * layers
Definition: darknet.h:441
data * d
Definition: darknet.h:577
free_image
Definition: darknet.py:95
float w
Definition: darknet.h:586
int subdivisions
Definition: darknet.h:440
int h
Definition: darknet.h:140
image load_image_color(char *filename, int w, int h)
Definition: image.c:1486
float find_float_arg(int argc, char **argv, char *arg, float def)
Definition: utils.c:148
int classes
Definition: darknet.h:566
float get_current_rate(network *net)
Definition: network.c:90
float h
Definition: darknet.h:586
float x
Definition: darknet.h:586
box bbox
Definition: darknet.h:524
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
int n
Definition: darknet.h:555
void print_detector_detections(FILE **fps, char *id, detection *dets, int total, int classes, int w, int h)
Definition: detector.c:191
void * load_thread(void *ptr)
Definition: data.c:1090
float box_iou(box a, box b)
Definition: box.c:179
int w
Definition: darknet.h:513
void cuda_set_device(int n)
Definition: cuda.c:176
char * path
Definition: darknet.h:554
int coords
Definition: darknet.h:173
Definition: darknet.h:602
int coco_ids[]
Definition: coco.c:7
list * read_data_cfg(char *filename)
Definition: option_list.c:7
void copy_cpu(int N, float *X, int INCX, float *Y, int INCY)
Definition: blas.c:226
int random
Definition: darknet.h:195
int * read_map(char *filename)
Definition: utils.c:59
image * resized
Definition: darknet.h:579
int classes
Definition: darknet.h:172
int c
Definition: darknet.h:468
float jitter
Definition: darknet.h:163
int gpu_index
Definition: cuda.c:1
size_t get_current_batch(network *net)
Definition: network.c:63
void draw_detections(image im, detection *dets, int num, float thresh, char **names, image **alphabet, int classes)
Definition: image.c:239
void find_replace(char *str, char *orig, char *rep, char *output)
Definition: utils.c:216
void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char *outfile)
Definition: detector.c:234
int h
Definition: darknet.h:468
int n
Definition: darknet.h:435
get_network_boxes
Definition: darknet.py:65
float y
Definition: darknet.h:520
void print_imagenet_detections(FILE *fp, int id, detection *dets, int total, int classes, int w, int h)
Definition: detector.c:212
list * get_paths(char *filename)
Definition: data.c:12
void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *outfile)
Definition: detector.c:364
pthread_t load_data(load_args args)
Definition: data.c:1180
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
do_nms_obj
Definition: darknet.py:89
Definition: darknet.h:538
double what_time_is_it_now()
Definition: utils.c:27
Definition: darknet.h:519
Definition: darknet.h:119
float * data
Definition: darknet.h:516