darknet  v3
coco.c
Go to the documentation of this file.
1 #include "darknet.h"
2 
3 #include <stdio.h>
4 
5 char *coco_classes[] = {"person","bicycle","car","motorcycle","airplane","bus","train","truck","boat","traffic light","fire hydrant","stop sign","parking meter","bench","bird","cat","dog","horse","sheep","cow","elephant","bear","zebra","giraffe","backpack","umbrella","handbag","tie","suitcase","frisbee","skis","snowboard","sports ball","kite","baseball bat","baseball glove","skateboard","surfboard","tennis racket","bottle","wine glass","cup","fork","knife","spoon","bowl","banana","apple","sandwich","orange","broccoli","carrot","hot dog","pizza","donut","cake","chair","couch","potted plant","bed","dining table","toilet","tv","laptop","mouse","remote","keyboard","cell phone","microwave","oven","toaster","sink","refrigerator","book","clock","vase","scissors","teddy bear","hair drier","toothbrush"};
6 
7 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};
8 
9 void train_coco(char *cfgfile, char *weightfile)
10 {
11  //char *train_images = "/home/pjreddie/data/voc/test/train.txt";
12  //char *train_images = "/home/pjreddie/data/coco/train.txt";
13  char *train_images = "data/coco.trainval.txt";
14  //char *train_images = "data/bags.train.list";
15  char *backup_directory = "/home/pjreddie/backup/";
16  srand(time(0));
17  char *base = basecfg(cfgfile);
18  printf("%s\n", base);
19  float avg_loss = -1;
20  network *net = load_network(cfgfile, weightfile, 0);
21  printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
22  int imgs = net->batch*net->subdivisions;
23  int i = *net->seen/imgs;
24  data train, buffer;
25 
26 
27  layer l = net->layers[net->n - 1];
28 
29  int side = l.side;
30  int classes = l.classes;
31  float jitter = l.jitter;
32 
33  list *plist = get_paths(train_images);
34  //int N = plist->size;
35  char **paths = (char **)list_to_array(plist);
36 
37  load_args args = {0};
38  args.w = net->w;
39  args.h = net->h;
40  args.paths = paths;
41  args.n = imgs;
42  args.m = plist->size;
43  args.classes = classes;
44  args.jitter = jitter;
45  args.num_boxes = side;
46  args.d = &buffer;
47  args.type = REGION_DATA;
48 
49  args.angle = net->angle;
50  args.exposure = net->exposure;
51  args.saturation = net->saturation;
52  args.hue = net->hue;
53 
54  pthread_t load_thread = load_data_in_thread(args);
55  clock_t time;
56  //while(i*imgs < N*120){
57  while(get_current_batch(net) < net->max_batches){
58  i += 1;
59  time=clock();
60  pthread_join(load_thread, 0);
61  train = buffer;
62  load_thread = load_data_in_thread(args);
63 
64  printf("Loaded: %lf seconds\n", sec(clock()-time));
65 
66  /*
67  image im = float_to_image(net->w, net->h, 3, train.X.vals[113]);
68  image copy = copy_image(im);
69  draw_coco(copy, train.y.vals[113], 7, "truth");
70  cvWaitKey(0);
71  free_image(copy);
72  */
73 
74  time=clock();
75  float loss = train_network(net, train);
76  if (avg_loss < 0) avg_loss = loss;
77  avg_loss = avg_loss*.9 + loss*.1;
78 
79  printf("%d: %f, %f avg, %f rate, %lf seconds, %d images\n", i, loss, avg_loss, get_current_rate(net), sec(clock()-time), i*imgs);
80  if(i%1000==0 || (i < 1000 && i%100 == 0)){
81  char buff[256];
82  sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
83  save_weights(net, buff);
84  }
85  if(i%100==0){
86  char buff[256];
87  sprintf(buff, "%s/%s.backup", backup_directory, base);
88  save_weights(net, buff);
89  }
90  free_data(train);
91  }
92  char buff[256];
93  sprintf(buff, "%s/%s_final.weights", backup_directory, base);
94  save_weights(net, buff);
95 }
96 
97 static void print_cocos(FILE *fp, int image_id, detection *dets, int num_boxes, int classes, int w, int h)
98 {
99  int i, j;
100  for(i = 0; i < num_boxes; ++i){
101  float xmin = dets[i].bbox.x - dets[i].bbox.w/2.;
102  float xmax = dets[i].bbox.x + dets[i].bbox.w/2.;
103  float ymin = dets[i].bbox.y - dets[i].bbox.h/2.;
104  float ymax = dets[i].bbox.y + dets[i].bbox.h/2.;
105 
106  if (xmin < 0) xmin = 0;
107  if (ymin < 0) ymin = 0;
108  if (xmax > w) xmax = w;
109  if (ymax > h) ymax = h;
110 
111  float bx = xmin;
112  float by = ymin;
113  float bw = xmax - xmin;
114  float bh = ymax - ymin;
115 
116  for(j = 0; j < classes; ++j){
117  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]);
118  }
119  }
120 }
121 
122 int get_coco_image_id(char *filename)
123 {
124  char *p = strrchr(filename, '_');
125  return atoi(p+1);
126 }
127 
128 void validate_coco(char *cfg, char *weights)
129 {
130  network *net = load_network(cfg, weights, 0);
131  set_batch_network(net, 1);
132  fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
133  srand(time(0));
134 
135  char *base = "results/";
136  list *plist = get_paths("data/coco_val_5k.list");
137  //list *plist = get_paths("/home/pjreddie/data/people-art/test.txt");
138  //list *plist = get_paths("/home/pjreddie/data/voc/test/2007_test.txt");
139  char **paths = (char **)list_to_array(plist);
140 
141  layer l = net->layers[net->n-1];
142  int classes = l.classes;
143 
144  char buff[1024];
145  snprintf(buff, 1024, "%s/coco_results.json", base);
146  FILE *fp = fopen(buff, "w");
147  fprintf(fp, "[\n");
148 
149  int m = plist->size;
150  int i=0;
151  int t;
152 
153  float thresh = .01;
154  int nms = 1;
155  float iou_thresh = .5;
156 
157  int nthreads = 8;
158  image *val = calloc(nthreads, sizeof(image));
159  image *val_resized = calloc(nthreads, sizeof(image));
160  image *buf = calloc(nthreads, sizeof(image));
161  image *buf_resized = calloc(nthreads, sizeof(image));
162  pthread_t *thr = calloc(nthreads, sizeof(pthread_t));
163 
164  load_args args = {0};
165  args.w = net->w;
166  args.h = net->h;
167  args.type = IMAGE_DATA;
168 
169  for(t = 0; t < nthreads; ++t){
170  args.path = paths[i+t];
171  args.im = &buf[t];
172  args.resized = &buf_resized[t];
173  thr[t] = load_data_in_thread(args);
174  }
175  time_t start = time(0);
176  for(i = nthreads; i < m+nthreads; i += nthreads){
177  fprintf(stderr, "%d\n", i);
178  for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
179  pthread_join(thr[t], 0);
180  val[t] = buf[t];
181  val_resized[t] = buf_resized[t];
182  }
183  for(t = 0; t < nthreads && i+t < m; ++t){
184  args.path = paths[i+t];
185  args.im = &buf[t];
186  args.resized = &buf_resized[t];
187  thr[t] = load_data_in_thread(args);
188  }
189  for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
190  char *path = paths[i+t-nthreads];
191  int image_id = get_coco_image_id(path);
192  float *X = val_resized[t].data;
193  network_predict(net, X);
194  int w = val[t].w;
195  int h = val[t].h;
196  int nboxes = 0;
197  detection *dets = get_network_boxes(net, w, h, thresh, 0, 0, 0, &nboxes);
198  if (nms) do_nms_sort(dets, l.side*l.side*l.n, classes, iou_thresh);
199  print_cocos(fp, image_id, dets, l.side*l.side*l.n, classes, w, h);
200  free_detections(dets, nboxes);
201  free_image(val[t]);
202  free_image(val_resized[t]);
203  }
204  }
205  fseek(fp, -2, SEEK_CUR);
206  fprintf(fp, "\n]\n");
207  fclose(fp);
208 
209  fprintf(stderr, "Total Detection Time: %f Seconds\n", (double)(time(0) - start));
210 }
211 
212 void validate_coco_recall(char *cfgfile, char *weightfile)
213 {
214  network *net = load_network(cfgfile, weightfile, 0);
215  set_batch_network(net, 1);
216  fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
217  srand(time(0));
218 
219  char *base = "results/comp4_det_test_";
220  list *plist = get_paths("/home/pjreddie/data/voc/test/2007_test.txt");
221  char **paths = (char **)list_to_array(plist);
222 
223  layer l = net->layers[net->n-1];
224  int classes = l.classes;
225  int side = l.side;
226 
227  int j, k;
228  FILE **fps = calloc(classes, sizeof(FILE *));
229  for(j = 0; j < classes; ++j){
230  char buff[1024];
231  snprintf(buff, 1024, "%s%s.txt", base, coco_classes[j]);
232  fps[j] = fopen(buff, "w");
233  }
234 
235  int m = plist->size;
236  int i=0;
237 
238  float thresh = .001;
239  int nms = 0;
240  float iou_thresh = .5;
241 
242  int total = 0;
243  int correct = 0;
244  int proposals = 0;
245  float avg_iou = 0;
246 
247  for(i = 0; i < m; ++i){
248  char *path = paths[i];
249  image orig = load_image_color(path, 0, 0);
250  image sized = resize_image(orig, net->w, net->h);
251  char *id = basecfg(path);
252  network_predict(net, sized.data);
253 
254  int nboxes = 0;
255  detection *dets = get_network_boxes(net, orig.w, orig.h, thresh, 0, 0, 1, &nboxes);
256  if (nms) do_nms_obj(dets, side*side*l.n, 1, nms);
257 
258  char labelpath[4096];
259  find_replace(path, "images", "labels", labelpath);
260  find_replace(labelpath, "JPEGImages", "labels", labelpath);
261  find_replace(labelpath, ".jpg", ".txt", labelpath);
262  find_replace(labelpath, ".JPEG", ".txt", labelpath);
263 
264  int num_labels = 0;
265  box_label *truth = read_boxes(labelpath, &num_labels);
266  for(k = 0; k < side*side*l.n; ++k){
267  if(dets[k].objectness > thresh){
268  ++proposals;
269  }
270  }
271  for (j = 0; j < num_labels; ++j) {
272  ++total;
273  box t = {truth[j].x, truth[j].y, truth[j].w, truth[j].h};
274  float best_iou = 0;
275  for(k = 0; k < side*side*l.n; ++k){
276  float iou = box_iou(dets[k].bbox, t);
277  if(dets[k].objectness > thresh && iou > best_iou){
278  best_iou = iou;
279  }
280  }
281  avg_iou += best_iou;
282  if(best_iou > iou_thresh){
283  ++correct;
284  }
285  }
286  free_detections(dets, nboxes);
287  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);
288  free(id);
289  free_image(orig);
290  free_image(sized);
291  }
292 }
293 
294 void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh)
295 {
296  image **alphabet = load_alphabet();
297  network *net = load_network(cfgfile, weightfile, 0);
298  layer l = net->layers[net->n-1];
299  set_batch_network(net, 1);
300  srand(2222222);
301  float nms = .4;
302  clock_t time;
303  char buff[256];
304  char *input = buff;
305  while(1){
306  if(filename){
307  strncpy(input, filename, 256);
308  } else {
309  printf("Enter Image Path: ");
310  fflush(stdout);
311  input = fgets(input, 256, stdin);
312  if(!input) return;
313  strtok(input, "\n");
314  }
315  image im = load_image_color(input,0,0);
316  image sized = resize_image(im, net->w, net->h);
317  float *X = sized.data;
318  time=clock();
319  network_predict(net, X);
320  printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
321 
322  int nboxes = 0;
323  detection *dets = get_network_boxes(net, 1, 1, thresh, 0, 0, 0, &nboxes);
324  if (nms) do_nms_sort(dets, l.side*l.side*l.n, l.classes, nms);
325 
326  draw_detections(im, dets, l.side*l.side*l.n, thresh, coco_classes, alphabet, 80);
327  save_image(im, "prediction");
328  show_image(im, "predictions", 0);
329  free_detections(dets, nboxes);
330  free_image(im);
331  free_image(sized);
332  if (filename) break;
333  }
334 }
335 
336 void run_coco(int argc, char **argv)
337 {
338  char *prefix = find_char_arg(argc, argv, "-prefix", 0);
339  float thresh = find_float_arg(argc, argv, "-thresh", .2);
340  int cam_index = find_int_arg(argc, argv, "-c", 0);
341  int frame_skip = find_int_arg(argc, argv, "-s", 0);
342 
343  if(argc < 4){
344  fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
345  return;
346  }
347 
348  char *cfg = argv[3];
349  char *weights = (argc > 4) ? argv[4] : 0;
350  char *filename = (argc > 5) ? argv[5]: 0;
351  int avg = find_int_arg(argc, argv, "-avg", 1);
352  if(0==strcmp(argv[2], "test")) test_coco(cfg, weights, filename, thresh);
353  else if(0==strcmp(argv[2], "train")) train_coco(cfg, weights);
354  else if(0==strcmp(argv[2], "valid")) validate_coco(cfg, weights);
355  else if(0==strcmp(argv[2], "recall")) validate_coco_recall(cfg, weights);
356  else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, coco_classes, 80, frame_skip, prefix, avg, .5, 0,0,0,0);
357 }
free_detections
Definition: darknet.py:73
float hue
Definition: darknet.h:576
void run_coco(int argc, char **argv)
Definition: coco.c:336
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
image * im
Definition: darknet.h:578
pthread_t load_data_in_thread(load_args args)
Definition: data.c:1135
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
float hue
Definition: darknet.h:478
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
size_t * seen
Definition: darknet.h:437
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
int get_coco_image_id(char *filename)
Definition: coco.c:122
int h
Definition: darknet.h:558
float jitter
Definition: darknet.h:571
void validate_coco(char *cfg, char *weights)
Definition: coco.c:128
data_type type
Definition: darknet.h:580
void save_weights(network *net, char *filename)
Definition: parser.c:1080
int side
Definition: darknet.h:146
do_nms_sort
Definition: darknet.py:92
network_predict
Definition: darknet.py:79
float exposure
Definition: darknet.h:575
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
float x
Definition: darknet.h:520
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
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
void train_coco(char *cfgfile, char *weightfile)
Definition: coco.c:9
float get_current_rate(network *net)
Definition: network.c:90
float saturation
Definition: darknet.h:477
float h
Definition: darknet.h:586
float sec(clock_t clocks)
Definition: utils.c:232
float saturation
Definition: darknet.h:574
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
int n
Definition: darknet.h:555
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
char * coco_classes[]
Definition: coco.c:5
char * path
Definition: darknet.h:554
Definition: darknet.h:602
int coco_ids[]
Definition: coco.c:7
image * resized
Definition: darknet.h:579
void test_coco(char *cfgfile, char *weightfile, char *filename, float thresh)
Definition: coco.c:294
int classes
Definition: darknet.h:172
float jitter
Definition: darknet.h:163
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
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
float angle
Definition: darknet.h:572
list * get_paths(char *filename)
Definition: data.c:12
void validate_coco_recall(char *cfgfile, char *weightfile)
Definition: coco.c:212
int w
Definition: darknet.h:468
list classes
Definition: voc_label.py:9
do_nms_obj
Definition: darknet.py:89
Definition: darknet.h:538
Definition: darknet.h:519
Definition: darknet.h:119
float * data
Definition: darknet.h:516
float exposure
Definition: darknet.h:476
float angle
Definition: darknet.h:474