darknet  v3
lsd.c
Go to the documentation of this file.
1 #include <math.h>
2 #include "darknet.h"
3 
4 /*
5 void train_lsd3(char *fcfg, char *fweight, char *gcfg, char *gweight, char *acfg, char *aweight, int clear)
6 {
7 #ifdef GPU
8  //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
9  char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list";
10  //char *style_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
11  char *style_images = "/home/pjreddie/zelda.txt";
12  char *backup_directory = "/home/pjreddie/backup/";
13  srand(time(0));
14  network fnet = load_network(fcfg, fweight, clear);
15  network gnet = load_network(gcfg, gweight, clear);
16  network anet = load_network(acfg, aweight, clear);
17  char *gbase = basecfg(gcfg);
18  char *abase = basecfg(acfg);
19 
20  printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet->learning_rate, gnet->momentum, gnet->decay);
21  int imgs = gnet->batch*gnet->subdivisions;
22  int i = *gnet->seen/imgs;
23  data train, tbuffer;
24  data style, sbuffer;
25 
26 
27  list *slist = get_paths(style_images);
28  char **spaths = (char **)list_to_array(slist);
29 
30  list *tlist = get_paths(train_images);
31  char **tpaths = (char **)list_to_array(tlist);
32 
33  load_args targs= get_base_args(gnet);
34  targs.paths = tpaths;
35  targs.n = imgs;
36  targs.m = tlist->size;
37  targs.d = &tbuffer;
38  targs.type = CLASSIFICATION_DATA;
39  targs.classes = 1;
40  char *ls[1] = {"zelda"};
41  targs.labels = ls;
42 
43  load_args sargs = get_base_args(gnet);
44  sargs.paths = spaths;
45  sargs.n = imgs;
46  sargs.m = slist->size;
47  sargs.d = &sbuffer;
48  sargs.type = CLASSIFICATION_DATA;
49  sargs.classes = 1;
50  sargs.labels = ls;
51 
52  pthread_t tload_thread = load_data_in_thread(targs);
53  pthread_t sload_thread = load_data_in_thread(sargs);
54  clock_t time;
55 
56  float aloss_avg = -1;
57  float floss_avg = -1;
58 
59  fnet->train=1;
60  int x_size = fnet->inputs*fnet->batch;
61  int y_size = fnet->truths*fnet->batch;
62  float *X = calloc(x_size, sizeof(float));
63  float *y = calloc(y_size, sizeof(float));
64 
65 
66  int ax_size = anet->inputs*anet->batch;
67  int ay_size = anet->truths*anet->batch;
68  fill_gpu(ay_size, .9, anet->truth_gpu, 1);
69  anet->delta_gpu = cuda_make_array(0, ax_size);
70  anet->train = 1;
71 
72  int gx_size = gnet->inputs*gnet->batch;
73  int gy_size = gnet->truths*gnet->batch;
74  gstate.input = cuda_make_array(0, gx_size);
75  gstate.truth = 0;
76  gstate.delta = 0;
77  gstate.train = 1;
78 
79  while (get_current_batch(gnet) < gnet->max_batches) {
80  i += 1;
81  time=clock();
82  pthread_join(tload_thread, 0);
83  pthread_join(sload_thread, 0);
84  train = tbuffer;
85  style = sbuffer;
86  tload_thread = load_data_in_thread(targs);
87  sload_thread = load_data_in_thread(sargs);
88 
89  printf("Loaded: %lf seconds\n", sec(clock()-time));
90 
91  data generated = copy_data(train);
92  time=clock();
93 
94  int j, k;
95  float floss = 0;
96  for(j = 0; j < fnet->subdivisions; ++j){
97  layer imlayer = gnet->layers[gnet->n - 1];
98  get_next_batch(train, fnet->batch, j*fnet->batch, X, y);
99 
100  cuda_push_array(fstate.input, X, x_size);
101  cuda_push_array(gstate.input, X, gx_size);
102  *gnet->seen += gnet->batch;
103 
104  forward_network_gpu(fnet, fstate);
105  float *feats = fnet->layers[fnet->n - 2].output_gpu;
106  copy_gpu(y_size, feats, 1, fstate.truth, 1);
107 
108  forward_network_gpu(gnet, gstate);
109  float *gen = gnet->layers[gnet->n-1].output_gpu;
110  copy_gpu(x_size, gen, 1, fstate.input, 1);
111 
112  fill_gpu(x_size, 0, fstate.delta, 1);
113  forward_network_gpu(fnet, fstate);
114  backward_network_gpu(fnet, fstate);
115  //HERE
116 
117  astate.input = gen;
118  fill_gpu(ax_size, 0, astate.delta, 1);
119  forward_network_gpu(anet, astate);
120  backward_network_gpu(anet, astate);
121 
122  float *delta = imlayer.delta_gpu;
123  fill_gpu(x_size, 0, delta, 1);
124  scal_gpu(x_size, 100, astate.delta, 1);
125  scal_gpu(x_size, .001, fstate.delta, 1);
126  axpy_gpu(x_size, 1, fstate.delta, 1, delta, 1);
127  axpy_gpu(x_size, 1, astate.delta, 1, delta, 1);
128 
129  //fill_gpu(x_size, 0, delta, 1);
130  //cuda_push_array(delta, X, x_size);
131  //axpy_gpu(x_size, -1, imlayer.output_gpu, 1, delta, 1);
132  //printf("pix error: %f\n", cuda_mag_array(delta, x_size));
133  printf("fea error: %f\n", cuda_mag_array(fstate.delta, x_size));
134  printf("adv error: %f\n", cuda_mag_array(astate.delta, x_size));
135  //axpy_gpu(x_size, 1, astate.delta, 1, delta, 1);
136 
137  backward_network_gpu(gnet, gstate);
138 
139  floss += get_network_cost(fnet) /(fnet->subdivisions*fnet->batch);
140 
141  cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch);
142  for(k = 0; k < gnet->batch; ++k){
143  int index = j*gnet->batch + k;
144  copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1);
145  generated.y.vals[index][0] = .1;
146  style.y.vals[index][0] = .9;
147  }
148  }
149 
150 */
151 /*
152  image sim = float_to_image(anet->w, anet->h, anet->c, style.X.vals[j]);
153  show_image(sim, "style");
154  cvWaitKey(0);
155  */
156  /*
157 
158  harmless_update_network_gpu(anet);
159 
160  data merge = concat_data(style, generated);
161  randomize_data(merge);
162  float aloss = train_network(anet, merge);
163 
164  update_network_gpu(gnet);
165 
166  free_data(merge);
167  free_data(train);
168  free_data(generated);
169  free_data(style);
170  if (aloss_avg < 0) aloss_avg = aloss;
171  if (floss_avg < 0) floss_avg = floss;
172  aloss_avg = aloss_avg*.9 + aloss*.1;
173  floss_avg = floss_avg*.9 + floss*.1;
174 
175  printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, floss, aloss, floss_avg, aloss_avg, get_current_rate(gnet), sec(clock()-time), i*imgs);
176  if(i%1000==0){
177  char buff[256];
178  sprintf(buff, "%s/%s_%d.weights", backup_directory, gbase, i);
179  save_weights(gnet, buff);
180  sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
181  save_weights(anet, buff);
182  }
183  if(i%100==0){
184  char buff[256];
185  sprintf(buff, "%s/%s.backup", backup_directory, gbase);
186  save_weights(gnet, buff);
187  sprintf(buff, "%s/%s.backup", backup_directory, abase);
188  save_weights(anet, buff);
189  }
190  }
191 #endif
192 }
193 */
194 
195 /*
196 void train_pix2pix(char *cfg, char *weight, char *acfg, char *aweight, int clear)
197 {
198 #ifdef GPU
199  //char *train_images = "/home/pjreddie/data/coco/train1.txt";
200  //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
201  char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list";
202  char *backup_directory = "/home/pjreddie/backup/";
203  srand(time(0));
204  char *base = basecfg(cfg);
205  char *abase = basecfg(acfg);
206  printf("%s\n", base);
207  network net = load_network(cfg, weight, clear);
208  network anet = load_network(acfg, aweight, clear);
209 
210  int i, j, k;
211  layer imlayer = {0};
212  for (i = 0; i < net->n; ++i) {
213  if (net->layers[i].out_c == 3) {
214  imlayer = net->layers[i];
215  break;
216  }
217  }
218 
219  printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
220  int imgs = net->batch*net->subdivisions;
221  i = *net->seen/imgs;
222  data train, buffer;
223 
224 
225  list *plist = get_paths(train_images);
226  //int N = plist->size;
227  char **paths = (char **)list_to_array(plist);
228 
229  load_args args = {0};
230  args.w = net->w;
231  args.h = net->h;
232  args.paths = paths;
233  args.n = imgs;
234  args.m = plist->size;
235  args.d = &buffer;
236 
237  args.min = net->min_crop;
238  args.max = net->max_crop;
239  args.angle = net->angle;
240  args.aspect = net->aspect;
241  args.exposure = net->exposure;
242  args.saturation = net->saturation;
243  args.hue = net->hue;
244  args.size = net->w;
245  args.type = CLASSIFICATION_DATA;
246  args.classes = 1;
247  char *ls[1] = {"coco"};
248  args.labels = ls;
249 
250  pthread_t load_thread = load_data_in_thread(args);
251  clock_t time;
252 
253  network_state gstate = {0};
254  gstate.index = 0;
255  gstate.net = net;
256  int x_size = get_network_input_size(net)*net->batch;
257  int y_size = x_size;
258  gstate.input = cuda_make_array(0, x_size);
259  gstate.truth = cuda_make_array(0, y_size);
260  gstate.delta = 0;
261  gstate.train = 1;
262  float *pixs = calloc(x_size, sizeof(float));
263  float *graypixs = calloc(x_size, sizeof(float));
264  float *y = calloc(y_size, sizeof(float));
265 
266  network_state astate = {0};
267  astate.index = 0;
268  astate.net = anet;
269  int ay_size = get_network_output_size(anet)*anet->batch;
270  astate.input = 0;
271  astate.truth = 0;
272  astate.delta = 0;
273  astate.train = 1;
274 
275  float *imerror = cuda_make_array(0, imlayer.outputs);
276  float *ones_gpu = cuda_make_array(0, ay_size);
277  fill_gpu(ay_size, .9, ones_gpu, 1);
278 
279  float aloss_avg = -1;
280  float gloss_avg = -1;
281 
282  //data generated = copy_data(train);
283 
284  while (get_current_batch(net) < net->max_batches) {
285  i += 1;
286  time=clock();
287  pthread_join(load_thread, 0);
288  train = buffer;
289  load_thread = load_data_in_thread(args);
290 
291  printf("Loaded: %lf seconds\n", sec(clock()-time));
292 
293  data gray = copy_data(train);
294  for(j = 0; j < imgs; ++j){
295  image gim = float_to_image(net->w, net->h, net->c, gray.X.vals[j]);
296  grayscale_image_3c(gim);
297  train.y.vals[j][0] = .9;
298 
299  image yim = float_to_image(net->w, net->h, net->c, train.X.vals[j]);
300  //rgb_to_yuv(yim);
301  }
302  time=clock();
303  float gloss = 0;
304 
305  for(j = 0; j < net->subdivisions; ++j){
306  get_next_batch(train, net->batch, j*net->batch, pixs, y);
307  get_next_batch(gray, net->batch, j*net->batch, graypixs, y);
308  cuda_push_array(gstate.input, graypixs, x_size);
309  cuda_push_array(gstate.truth, pixs, y_size);
310  */
311  /*
312  image origi = float_to_image(net->w, net->h, 3, pixs);
313  image grayi = float_to_image(net->w, net->h, 3, graypixs);
314  show_image(grayi, "gray");
315  show_image(origi, "orig");
316  cvWaitKey(0);
317  */
318  /*
319  *net->seen += net->batch;
320  forward_network_gpu(net, gstate);
321 
322  fill_gpu(imlayer.outputs, 0, imerror, 1);
323  astate.input = imlayer.output_gpu;
324  astate.delta = imerror;
325  astate.truth = ones_gpu;
326  forward_network_gpu(anet, astate);
327  backward_network_gpu(anet, astate);
328 
329  scal_gpu(imlayer.outputs, .1, net->layers[net->n-1].delta_gpu, 1);
330 
331  backward_network_gpu(net, gstate);
332 
333  scal_gpu(imlayer.outputs, 1000, imerror, 1);
334 
335  printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs));
336  printf("features %f\n", cuda_mag_array(net->layers[net->n-1].delta_gpu, imlayer.outputs));
337 
338  axpy_gpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1);
339 
340  gloss += get_network_cost(net) /(net->subdivisions*net->batch);
341 
342  cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch);
343  for(k = 0; k < net->batch; ++k){
344  int index = j*net->batch + k;
345  copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1);
346  gray.y.vals[index][0] = .1;
347  }
348  }
349  harmless_update_network_gpu(anet);
350 
351  data merge = concat_data(train, gray);
352  randomize_data(merge);
353  float aloss = train_network(anet, merge);
354 
355  update_network_gpu(net);
356  update_network_gpu(anet);
357  free_data(merge);
358  free_data(train);
359  free_data(gray);
360  if (aloss_avg < 0) aloss_avg = aloss;
361  aloss_avg = aloss_avg*.9 + aloss*.1;
362  gloss_avg = gloss_avg*.9 + gloss*.1;
363 
364  printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, gloss, aloss, gloss_avg, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs);
365  if(i%1000==0){
366  char buff[256];
367  sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
368  save_weights(net, buff);
369  sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
370  save_weights(anet, buff);
371  }
372  if(i%100==0){
373  char buff[256];
374  sprintf(buff, "%s/%s.backup", backup_directory, base);
375  save_weights(net, buff);
376  sprintf(buff, "%s/%s.backup", backup_directory, abase);
377  save_weights(anet, buff);
378  }
379  }
380  char buff[256];
381  sprintf(buff, "%s/%s_final.weights", backup_directory, base);
382  save_weights(net, buff);
383 #endif
384 }
385 */
386 
387 void slerp(float *start, float *end, float s, int n, float *out)
388 {
389  float omega = acos(dot_cpu(n, start, 1, end, 1));
390  float so = sin(omega);
391  fill_cpu(n, 0, out, 1);
392  axpy_cpu(n, sin((1-s)*omega)/so, start, 1, out, 1);
393  axpy_cpu(n, sin(s*omega)/so, end, 1, out, 1);
394 
395  float mag = mag_array(out, n);
396  scale_array(out, n, 1./mag);
397 }
398 
399 image random_unit_vector_image(int w, int h, int c)
400 {
401  image im = make_image(w, h, c);
402  int i;
403  for(i = 0; i < im.w*im.h*im.c; ++i){
404  im.data[i] = rand_normal();
405  }
406  float mag = mag_array(im.data, im.w*im.h*im.c);
407  scale_array(im.data, im.w*im.h*im.c, 1./mag);
408  return im;
409 }
410 
411 void inter_dcgan(char *cfgfile, char *weightfile)
412 {
413  network *net = load_network(cfgfile, weightfile, 0);
414  set_batch_network(net, 1);
415  srand(2222222);
416 
417  clock_t time;
418  char buff[256];
419  char *input = buff;
420  int i, imlayer = 0;
421 
422  for (i = 0; i < net->n; ++i) {
423  if (net->layers[i].out_c == 3) {
424  imlayer = i;
425  printf("%d\n", i);
426  break;
427  }
428  }
429  image start = random_unit_vector_image(net->w, net->h, net->c);
430  image end = random_unit_vector_image(net->w, net->h, net->c);
431  image im = make_image(net->w, net->h, net->c);
432  image orig = copy_image(start);
433 
434  int c = 0;
435  int count = 0;
436  int max_count = 15;
437  while(1){
438  ++c;
439 
440  if(count == max_count){
441  count = 0;
442  free_image(start);
443  start = end;
444  end = random_unit_vector_image(net->w, net->h, net->c);
445  if(c > 300){
446  end = orig;
447  }
448  if(c>300 + max_count) return;
449  }
450  ++count;
451 
452  slerp(start.data, end.data, (float)count / max_count, im.w*im.h*im.c, im.data);
453 
454  float *X = im.data;
455  time=clock();
456  network_predict(net, X);
457  image out = get_network_image_layer(net, imlayer);
458  //yuv_to_rgb(out);
459  normalize_image(out);
460  printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
461  //char buff[256];
462  sprintf(buff, "out%05d", c);
463  save_image(out, "out");
464  save_image(out, buff);
465  show_image(out, "out", 0);
466  }
467 }
468 
469 void test_dcgan(char *cfgfile, char *weightfile)
470 {
471  network *net = load_network(cfgfile, weightfile, 0);
472  set_batch_network(net, 1);
473  srand(2222222);
474 
475  clock_t time;
476  char buff[256];
477  char *input = buff;
478  int imlayer = 0;
479 
480  imlayer = net->n-1;
481 
482  while(1){
483  image im = make_image(net->w, net->h, net->c);
484  int i;
485  for(i = 0; i < im.w*im.h*im.c; ++i){
486  im.data[i] = rand_normal();
487  }
488  //float mag = mag_array(im.data, im.w*im.h*im.c);
489  //scale_array(im.data, im.w*im.h*im.c, 1./mag);
490 
491  float *X = im.data;
492  time=clock();
493  network_predict(net, X);
494  image out = get_network_image_layer(net, imlayer);
495  //yuv_to_rgb(out);
496  normalize_image(out);
497  printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
498  save_image(out, "out");
499  show_image(out, "out", 0);
500 
501  free_image(im);
502  }
503 }
504 
505 void set_network_alpha_beta(network *net, float alpha, float beta)
506 {
507  int i;
508  for(i = 0; i < net->n; ++i){
509  if(net->layers[i].type == SHORTCUT){
510  net->layers[i].alpha = alpha;
511  net->layers[i].beta = beta;
512  }
513  }
514 }
515 
516 void train_prog(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images, int maxbatch)
517 {
518 #ifdef GPU
519  char *backup_directory = "/home/pjreddie/backup/";
520  srand(time(0));
521  char *base = basecfg(cfg);
522  char *abase = basecfg(acfg);
523  printf("%s\n", base);
524  network *gnet = load_network(cfg, weight, clear);
525  network *anet = load_network(acfg, aweight, clear);
526 
527  int i, j, k;
528  layer imlayer = gnet->layers[gnet->n-1];
529 
530  printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet->learning_rate, gnet->momentum, gnet->decay);
531  int imgs = gnet->batch*gnet->subdivisions;
532  i = *gnet->seen/imgs;
533  data train, buffer;
534 
535 
536  list *plist = get_paths(train_images);
537  char **paths = (char **)list_to_array(plist);
538 
539  load_args args= get_base_args(anet);
540  args.paths = paths;
541  args.n = imgs;
542  args.m = plist->size;
543  args.d = &buffer;
544  args.type = CLASSIFICATION_DATA;
545  args.threads=16;
546  args.classes = 1;
547  char *ls[2] = {"imagenet", "zzzzzzzz"};
548  args.labels = ls;
549 
550  pthread_t load_thread = load_data_in_thread(args);
551  clock_t time;
552 
553  gnet->train = 1;
554  anet->train = 1;
555 
556  int x_size = gnet->inputs*gnet->batch;
557  int y_size = gnet->truths*gnet->batch;
558  float *imerror = cuda_make_array(0, y_size);
559 
560  float aloss_avg = -1;
561 
562  if (maxbatch == 0) maxbatch = gnet->max_batches;
563  while (get_current_batch(gnet) < maxbatch) {
564  {
565  int cb = get_current_batch(gnet);
566  float alpha = (float) cb / (maxbatch/2);
567  if(alpha > 1) alpha = 1;
568  float beta = 1 - alpha;
569  printf("%f %f\n", alpha, beta);
570  set_network_alpha_beta(gnet, alpha, beta);
571  set_network_alpha_beta(anet, beta, alpha);
572  }
573 
574  i += 1;
575  time=clock();
576  pthread_join(load_thread, 0);
577  train = buffer;
578 
579  load_thread = load_data_in_thread(args);
580 
581  printf("Loaded: %lf seconds\n", sec(clock()-time));
582 
583  data gen = copy_data(train);
584  for (j = 0; j < imgs; ++j) {
585  train.y.vals[j][0] = 1;
586  gen.y.vals[j][0] = 0;
587  }
588  time=clock();
589 
590  for (j = 0; j < gnet->subdivisions; ++j) {
591  get_next_batch(train, gnet->batch, j*gnet->batch, gnet->truth, 0);
592  int z;
593  for(z = 0; z < x_size; ++z){
594  gnet->input[z] = rand_normal();
595  }
596  /*
597  for(z = 0; z < gnet->batch; ++z){
598  float mag = mag_array(gnet->input + z*gnet->inputs, gnet->inputs);
599  scale_array(gnet->input + z*gnet->inputs, gnet->inputs, 1./mag);
600  }
601  */
602  *gnet->seen += gnet->batch;
603  forward_network(gnet);
604 
605  fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1);
606  fill_cpu(anet->truths*anet->batch, 1, anet->truth, 1);
607  copy_cpu(anet->inputs*anet->batch, imlayer.output, 1, anet->input, 1);
608  anet->delta_gpu = imerror;
609  forward_network(anet);
610  backward_network(anet);
611 
612  //float genaloss = *anet->cost / anet->batch;
613 
614  scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1);
615  scal_gpu(imlayer.outputs*imlayer.batch, 0, gnet->layers[gnet->n-1].delta_gpu, 1);
616 
617  axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet->layers[gnet->n-1].delta_gpu, 1);
618 
619  backward_network(gnet);
620 
621  for(k = 0; k < gnet->batch; ++k){
622  int index = j*gnet->batch + k;
623  copy_cpu(gnet->outputs, gnet->output + k*gnet->outputs, 1, gen.X.vals[index], 1);
624  }
625  }
626  harmless_update_network_gpu(anet);
627 
628  data merge = concat_data(train, gen);
629  float aloss = train_network(anet, merge);
630 
631 #ifdef OPENCV
632  if(display){
633  image im = float_to_image(anet->w, anet->h, anet->c, gen.X.vals[0]);
634  image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]);
635  show_image(im, "gen", 1);
636  show_image(im2, "train", 1);
637  save_image(im, "gen");
638  save_image(im2, "train");
639  }
640 #endif
641 
642  update_network_gpu(gnet);
643 
644  free_data(merge);
645  free_data(train);
646  free_data(gen);
647  if (aloss_avg < 0) aloss_avg = aloss;
648  aloss_avg = aloss_avg*.9 + aloss*.1;
649 
650  printf("%d: adv: %f | adv_avg: %f, %f rate, %lf seconds, %d images\n", i, aloss, aloss_avg, get_current_rate(gnet), sec(clock()-time), i*imgs);
651  if(i%10000==0){
652  char buff[256];
653  sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
654  save_weights(gnet, buff);
655  sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
656  save_weights(anet, buff);
657  }
658  if(i%1000==0){
659  char buff[256];
660  sprintf(buff, "%s/%s.backup", backup_directory, base);
661  save_weights(gnet, buff);
662  sprintf(buff, "%s/%s.backup", backup_directory, abase);
663  save_weights(anet, buff);
664  }
665  }
666  char buff[256];
667  sprintf(buff, "%s/%s_final.weights", backup_directory, base);
668  save_weights(gnet, buff);
669 #endif
670 }
671 
672 void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images, int maxbatch)
673 {
674 #ifdef GPU
675  char *backup_directory = "/home/pjreddie/backup/";
676  srand(time(0));
677  char *base = basecfg(cfg);
678  char *abase = basecfg(acfg);
679  printf("%s\n", base);
680  network *gnet = load_network(cfg, weight, clear);
681  network *anet = load_network(acfg, aweight, clear);
682  //float orig_rate = anet->learning_rate;
683 
684  int i, j, k;
685  layer imlayer = {0};
686  for (i = 0; i < gnet->n; ++i) {
687  if (gnet->layers[i].out_c == 3) {
688  imlayer = gnet->layers[i];
689  break;
690  }
691  }
692 
693  printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", gnet->learning_rate, gnet->momentum, gnet->decay);
694  int imgs = gnet->batch*gnet->subdivisions;
695  i = *gnet->seen/imgs;
696  data train, buffer;
697 
698 
699  list *plist = get_paths(train_images);
700  //int N = plist->size;
701  char **paths = (char **)list_to_array(plist);
702 
703  load_args args= get_base_args(anet);
704  args.paths = paths;
705  args.n = imgs;
706  args.m = plist->size;
707  args.d = &buffer;
708  args.type = CLASSIFICATION_DATA;
709  args.threads=16;
710  args.classes = 1;
711  char *ls[2] = {"imagenet", "zzzzzzzz"};
712  args.labels = ls;
713 
714  pthread_t load_thread = load_data_in_thread(args);
715  clock_t time;
716 
717  gnet->train = 1;
718  anet->train = 1;
719 
720  int x_size = gnet->inputs*gnet->batch;
721  int y_size = gnet->truths*gnet->batch;
722  float *imerror = cuda_make_array(0, y_size);
723 
724  //int ay_size = anet->truths*anet->batch;
725 
726  float aloss_avg = -1;
727 
728  //data generated = copy_data(train);
729 
730  if (maxbatch == 0) maxbatch = gnet->max_batches;
731  while (get_current_batch(gnet) < maxbatch) {
732  i += 1;
733  time=clock();
734  pthread_join(load_thread, 0);
735  train = buffer;
736 
737  //translate_data_rows(train, -.5);
738  //scale_data_rows(train, 2);
739 
740  load_thread = load_data_in_thread(args);
741 
742  printf("Loaded: %lf seconds\n", sec(clock()-time));
743 
744  data gen = copy_data(train);
745  for (j = 0; j < imgs; ++j) {
746  train.y.vals[j][0] = 1;
747  gen.y.vals[j][0] = 0;
748  }
749  time=clock();
750 
751  for(j = 0; j < gnet->subdivisions; ++j){
752  get_next_batch(train, gnet->batch, j*gnet->batch, gnet->truth, 0);
753  int z;
754  for(z = 0; z < x_size; ++z){
755  gnet->input[z] = rand_normal();
756  }
757  for(z = 0; z < gnet->batch; ++z){
758  float mag = mag_array(gnet->input + z*gnet->inputs, gnet->inputs);
759  scale_array(gnet->input + z*gnet->inputs, gnet->inputs, 1./mag);
760  }
761  /*
762  for(z = 0; z < 100; ++z){
763  printf("%f, ", gnet->input[z]);
764  }
765  printf("\n");
766  printf("input: %f %f\n", mean_array(gnet->input, x_size), variance_array(gnet->input, x_size));
767  */
768 
769  //cuda_push_array(gnet->input_gpu, gnet->input, x_size);
770  //cuda_push_array(gnet->truth_gpu, gnet->truth, y_size);
771  *gnet->seen += gnet->batch;
772  forward_network(gnet);
773 
774  fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1);
775  fill_cpu(anet->truths*anet->batch, 1, anet->truth, 1);
776  copy_cpu(anet->inputs*anet->batch, imlayer.output, 1, anet->input, 1);
777  anet->delta_gpu = imerror;
778  forward_network(anet);
779  backward_network(anet);
780 
781  //float genaloss = *anet->cost / anet->batch;
782  //printf("%f\n", genaloss);
783 
784  scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1);
785  scal_gpu(imlayer.outputs*imlayer.batch, 0, gnet->layers[gnet->n-1].delta_gpu, 1);
786 
787  //printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch));
788  //printf("features %f\n", cuda_mag_array(gnet->layers[gnet->n-1].delta_gpu, imlayer.outputs*imlayer.batch));
789 
790  axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, gnet->layers[gnet->n-1].delta_gpu, 1);
791 
792  backward_network(gnet);
793 
794  /*
795  for(k = 0; k < gnet->n; ++k){
796  layer l = gnet->layers[k];
797  cuda_pull_array(l.output_gpu, l.output, l.outputs*l.batch);
798  printf("%d: %f %f\n", k, mean_array(l.output, l.outputs*l.batch), variance_array(l.output, l.outputs*l.batch));
799  }
800  */
801 
802  for(k = 0; k < gnet->batch; ++k){
803  int index = j*gnet->batch + k;
804  copy_cpu(gnet->outputs, gnet->output + k*gnet->outputs, 1, gen.X.vals[index], 1);
805  }
806  }
807  harmless_update_network_gpu(anet);
808 
809  data merge = concat_data(train, gen);
810  //randomize_data(merge);
811  float aloss = train_network(anet, merge);
812 
813  //translate_image(im, 1);
814  //scale_image(im, .5);
815  //translate_image(im2, 1);
816  //scale_image(im2, .5);
817 #ifdef OPENCV
818  if(display){
819  image im = float_to_image(anet->w, anet->h, anet->c, gen.X.vals[0]);
820  image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]);
821  show_image(im, "gen", 1);
822  show_image(im2, "train", 1);
823  save_image(im, "gen");
824  save_image(im2, "train");
825  }
826 #endif
827 
828  /*
829  if(aloss < .1){
830  anet->learning_rate = 0;
831  } else if (aloss > .3){
832  anet->learning_rate = orig_rate;
833  }
834  */
835 
836  update_network_gpu(gnet);
837 
838  free_data(merge);
839  free_data(train);
840  free_data(gen);
841  if (aloss_avg < 0) aloss_avg = aloss;
842  aloss_avg = aloss_avg*.9 + aloss*.1;
843 
844  printf("%d: adv: %f | adv_avg: %f, %f rate, %lf seconds, %d images\n", i, aloss, aloss_avg, get_current_rate(gnet), sec(clock()-time), i*imgs);
845  if(i%10000==0){
846  char buff[256];
847  sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
848  save_weights(gnet, buff);
849  sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
850  save_weights(anet, buff);
851  }
852  if(i%1000==0){
853  char buff[256];
854  sprintf(buff, "%s/%s.backup", backup_directory, base);
855  save_weights(gnet, buff);
856  sprintf(buff, "%s/%s.backup", backup_directory, abase);
857  save_weights(anet, buff);
858  }
859  }
860  char buff[256];
861  sprintf(buff, "%s/%s_final.weights", backup_directory, base);
862  save_weights(gnet, buff);
863 #endif
864 }
865 
866 void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display)
867 {
868 #ifdef GPU
869  //char *train_images = "/home/pjreddie/data/coco/train1.txt";
870  //char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
871  char *train_images = "/home/pjreddie/data/imagenet/imagenet1k.train.list";
872  char *backup_directory = "/home/pjreddie/backup/";
873  srand(time(0));
874  char *base = basecfg(cfg);
875  char *abase = basecfg(acfg);
876  printf("%s\n", base);
877  network *net = load_network(cfg, weight, clear);
878  network *anet = load_network(acfg, aweight, clear);
879 
880  int i, j, k;
881  layer imlayer = {0};
882  for (i = 0; i < net->n; ++i) {
883  if (net->layers[i].out_c == 3) {
884  imlayer = net->layers[i];
885  break;
886  }
887  }
888 
889  printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
890  int imgs = net->batch*net->subdivisions;
891  i = *net->seen/imgs;
892  data train, buffer;
893 
894 
895  list *plist = get_paths(train_images);
896  //int N = plist->size;
897  char **paths = (char **)list_to_array(plist);
898 
899  load_args args= get_base_args(net);
900  args.paths = paths;
901  args.n = imgs;
902  args.m = plist->size;
903  args.d = &buffer;
904 
905  args.type = CLASSIFICATION_DATA;
906  args.classes = 1;
907  char *ls[2] = {"imagenet"};
908  args.labels = ls;
909 
910  pthread_t load_thread = load_data_in_thread(args);
911  clock_t time;
912 
913  int x_size = net->inputs*net->batch;
914  //int y_size = x_size;
915  net->delta = 0;
916  net->train = 1;
917  float *pixs = calloc(x_size, sizeof(float));
918  float *graypixs = calloc(x_size, sizeof(float));
919  //float *y = calloc(y_size, sizeof(float));
920 
921  //int ay_size = anet->outputs*anet->batch;
922  anet->delta = 0;
923  anet->train = 1;
924 
925  float *imerror = cuda_make_array(0, imlayer.outputs*imlayer.batch);
926 
927  float aloss_avg = -1;
928  float gloss_avg = -1;
929 
930  //data generated = copy_data(train);
931 
932  while (get_current_batch(net) < net->max_batches) {
933  i += 1;
934  time=clock();
935  pthread_join(load_thread, 0);
936  train = buffer;
937  load_thread = load_data_in_thread(args);
938 
939  printf("Loaded: %lf seconds\n", sec(clock()-time));
940 
941  data gray = copy_data(train);
942  for(j = 0; j < imgs; ++j){
943  image gim = float_to_image(net->w, net->h, net->c, gray.X.vals[j]);
944  grayscale_image_3c(gim);
945  train.y.vals[j][0] = .95;
946  gray.y.vals[j][0] = .05;
947  }
948  time=clock();
949  float gloss = 0;
950 
951  for(j = 0; j < net->subdivisions; ++j){
952  get_next_batch(train, net->batch, j*net->batch, pixs, 0);
953  get_next_batch(gray, net->batch, j*net->batch, graypixs, 0);
954  cuda_push_array(net->input_gpu, graypixs, net->inputs*net->batch);
955  cuda_push_array(net->truth_gpu, pixs, net->truths*net->batch);
956  /*
957  image origi = float_to_image(net->w, net->h, 3, pixs);
958  image grayi = float_to_image(net->w, net->h, 3, graypixs);
959  show_image(grayi, "gray");
960  show_image(origi, "orig");
961  cvWaitKey(0);
962  */
963  *net->seen += net->batch;
964  forward_network_gpu(net);
965 
966  fill_gpu(imlayer.outputs*imlayer.batch, 0, imerror, 1);
967  copy_gpu(anet->inputs*anet->batch, imlayer.output_gpu, 1, anet->input_gpu, 1);
968  fill_gpu(anet->inputs*anet->batch, .95, anet->truth_gpu, 1);
969  anet->delta_gpu = imerror;
970  forward_network_gpu(anet);
971  backward_network_gpu(anet);
972 
973  scal_gpu(imlayer.outputs*imlayer.batch, 1./100., net->layers[net->n-1].delta_gpu, 1);
974 
975  scal_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1);
976 
977  printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs*imlayer.batch));
978  printf("features %f\n", cuda_mag_array(net->layers[net->n-1].delta_gpu, imlayer.outputs*imlayer.batch));
979 
980  axpy_gpu(imlayer.outputs*imlayer.batch, 1, imerror, 1, net->layers[net->n-1].delta_gpu, 1);
981 
982  backward_network_gpu(net);
983 
984 
985  gloss += *net->cost /(net->subdivisions*net->batch);
986 
987  for(k = 0; k < net->batch; ++k){
988  int index = j*net->batch + k;
989  copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, gray.X.vals[index], 1);
990  }
991  }
992  harmless_update_network_gpu(anet);
993 
994  data merge = concat_data(train, gray);
995  //randomize_data(merge);
996  float aloss = train_network(anet, merge);
997 
998  update_network_gpu(net);
999 
1000 #ifdef OPENCV
1001  if(display){
1002  image im = float_to_image(anet->w, anet->h, anet->c, gray.X.vals[0]);
1003  image im2 = float_to_image(anet->w, anet->h, anet->c, train.X.vals[0]);
1004  show_image(im, "gen", 1);
1005  show_image(im2, "train", 1);
1006  }
1007 #endif
1008  free_data(merge);
1009  free_data(train);
1010  free_data(gray);
1011  if (aloss_avg < 0) aloss_avg = aloss;
1012  aloss_avg = aloss_avg*.9 + aloss*.1;
1013  gloss_avg = gloss_avg*.9 + gloss*.1;
1014 
1015  printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, gloss, aloss, gloss_avg, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs);
1016  if(i%1000==0){
1017  char buff[256];
1018  sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
1019  save_weights(net, buff);
1020  sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
1021  save_weights(anet, buff);
1022  }
1023  if(i%100==0){
1024  char buff[256];
1025  sprintf(buff, "%s/%s.backup", backup_directory, base);
1026  save_weights(net, buff);
1027  sprintf(buff, "%s/%s.backup", backup_directory, abase);
1028  save_weights(anet, buff);
1029  }
1030  }
1031  char buff[256];
1032  sprintf(buff, "%s/%s_final.weights", backup_directory, base);
1033  save_weights(net, buff);
1034 #endif
1035 }
1036 
1037 /*
1038  void train_lsd2(char *cfgfile, char *weightfile, char *acfgfile, char *aweightfile, int clear)
1039  {
1040 #ifdef GPU
1041 char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
1042 char *backup_directory = "/home/pjreddie/backup/";
1043 srand(time(0));
1044 char *base = basecfg(cfgfile);
1045 printf("%s\n", base);
1046 network net = parse_network_cfg(cfgfile);
1047 if(weightfile){
1048 load_weights(&net, weightfile);
1049 }
1050 if(clear) *net->seen = 0;
1051 
1052 char *abase = basecfg(acfgfile);
1053 network anet = parse_network_cfg(acfgfile);
1054 if(aweightfile){
1055 load_weights(&anet, aweightfile);
1056 }
1057 if(clear) *anet->seen = 0;
1058 
1059 int i, j, k;
1060 layer imlayer = {0};
1061 for (i = 0; i < net->n; ++i) {
1062 if (net->layers[i].out_c == 3) {
1063 imlayer = net->layers[i];
1064 break;
1065 }
1066 }
1067 
1068 printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
1069 int imgs = net->batch*net->subdivisions;
1070 i = *net->seen/imgs;
1071 data train, buffer;
1072 
1073 
1074 list *plist = get_paths(train_images);
1075 //int N = plist->size;
1076 char **paths = (char **)list_to_array(plist);
1077 
1078 load_args args = {0};
1079 args.w = net->w;
1080 args.h = net->h;
1081 args.paths = paths;
1082 args.n = imgs;
1083 args.m = plist->size;
1084 args.d = &buffer;
1085 
1086 args.min = net->min_crop;
1087 args.max = net->max_crop;
1088 args.angle = net->angle;
1089 args.aspect = net->aspect;
1090 args.exposure = net->exposure;
1091 args.saturation = net->saturation;
1092 args.hue = net->hue;
1093 args.size = net->w;
1094 args.type = CLASSIFICATION_DATA;
1095 args.classes = 1;
1096 char *ls[1] = {"coco"};
1097 args.labels = ls;
1098 
1099 pthread_t load_thread = load_data_in_thread(args);
1100 clock_t time;
1101 
1102 network_state gstate = {0};
1103 gstate.index = 0;
1104 gstate.net = net;
1105 int x_size = get_network_input_size(net)*net->batch;
1106 int y_size = 1*net->batch;
1107 gstate.input = cuda_make_array(0, x_size);
1108 gstate.truth = 0;
1109 gstate.delta = 0;
1110 gstate.train = 1;
1111 float *X = calloc(x_size, sizeof(float));
1112 float *y = calloc(y_size, sizeof(float));
1113 
1114 network_state astate = {0};
1115 astate.index = 0;
1116 astate.net = anet;
1117 int ay_size = get_network_output_size(anet)*anet->batch;
1118 astate.input = 0;
1119 astate.truth = 0;
1120 astate.delta = 0;
1121 astate.train = 1;
1122 
1123 float *imerror = cuda_make_array(0, imlayer.outputs);
1124 float *ones_gpu = cuda_make_array(0, ay_size);
1125 fill_gpu(ay_size, 1, ones_gpu, 1);
1126 
1127 float aloss_avg = -1;
1128 float gloss_avg = -1;
1129 
1130 //data generated = copy_data(train);
1131 
1132 while (get_current_batch(net) < net->max_batches) {
1133  i += 1;
1134  time=clock();
1135  pthread_join(load_thread, 0);
1136  train = buffer;
1137  load_thread = load_data_in_thread(args);
1138 
1139  printf("Loaded: %lf seconds\n", sec(clock()-time));
1140 
1141  data generated = copy_data(train);
1142  time=clock();
1143  float gloss = 0;
1144 
1145  for(j = 0; j < net->subdivisions; ++j){
1146  get_next_batch(train, net->batch, j*net->batch, X, y);
1147  cuda_push_array(gstate.input, X, x_size);
1148  *net->seen += net->batch;
1149  forward_network_gpu(net, gstate);
1150 
1151  fill_gpu(imlayer.outputs, 0, imerror, 1);
1152  astate.input = imlayer.output_gpu;
1153  astate.delta = imerror;
1154  astate.truth = ones_gpu;
1155  forward_network_gpu(anet, astate);
1156  backward_network_gpu(anet, astate);
1157 
1158  scal_gpu(imlayer.outputs, 1, imerror, 1);
1159  axpy_gpu(imlayer.outputs, 1, imerror, 1, imlayer.delta_gpu, 1);
1160 
1161  backward_network_gpu(net, gstate);
1162 
1163  printf("features %f\n", cuda_mag_array(imlayer.delta_gpu, imlayer.outputs));
1164  printf("realness %f\n", cuda_mag_array(imerror, imlayer.outputs));
1165 
1166  gloss += get_network_cost(net) /(net->subdivisions*net->batch);
1167 
1168  cuda_pull_array(imlayer.output_gpu, imlayer.output, imlayer.outputs*imlayer.batch);
1169  for(k = 0; k < net->batch; ++k){
1170  int index = j*net->batch + k;
1171  copy_cpu(imlayer.outputs, imlayer.output + k*imlayer.outputs, 1, generated.X.vals[index], 1);
1172  generated.y.vals[index][0] = 0;
1173  }
1174  }
1175  harmless_update_network_gpu(anet);
1176 
1177  data merge = concat_data(train, generated);
1178  randomize_data(merge);
1179  float aloss = train_network(anet, merge);
1180 
1181  update_network_gpu(net);
1182  update_network_gpu(anet);
1183  free_data(merge);
1184  free_data(train);
1185  free_data(generated);
1186  if (aloss_avg < 0) aloss_avg = aloss;
1187  aloss_avg = aloss_avg*.9 + aloss*.1;
1188  gloss_avg = gloss_avg*.9 + gloss*.1;
1189 
1190  printf("%d: gen: %f, adv: %f | gen_avg: %f, adv_avg: %f, %f rate, %lf seconds, %d images\n", i, gloss, aloss, gloss_avg, aloss_avg, get_current_rate(net), sec(clock()-time), i*imgs);
1191  if(i%1000==0){
1192  char buff[256];
1193  sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
1194  save_weights(net, buff);
1195  sprintf(buff, "%s/%s_%d.weights", backup_directory, abase, i);
1196  save_weights(anet, buff);
1197  }
1198  if(i%100==0){
1199  char buff[256];
1200  sprintf(buff, "%s/%s.backup", backup_directory, base);
1201  save_weights(net, buff);
1202  sprintf(buff, "%s/%s.backup", backup_directory, abase);
1203  save_weights(anet, buff);
1204  }
1205 }
1206 char buff[256];
1207 sprintf(buff, "%s/%s_final.weights", backup_directory, base);
1208 save_weights(net, buff);
1209 #endif
1210 }
1211 */
1212 
1213 /*
1214  void train_lsd(char *cfgfile, char *weightfile, int clear)
1215  {
1216  char *train_images = "/home/pjreddie/data/coco/trainvalno5k.txt";
1217  char *backup_directory = "/home/pjreddie/backup/";
1218  srand(time(0));
1219  char *base = basecfg(cfgfile);
1220  printf("%s\n", base);
1221  float avg_loss = -1;
1222  network net = parse_network_cfg(cfgfile);
1223  if(weightfile){
1224  load_weights(&net, weightfile);
1225  }
1226  if(clear) *net->seen = 0;
1227  printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
1228  int imgs = net->batch*net->subdivisions;
1229  int i = *net->seen/imgs;
1230  data train, buffer;
1231 
1232 
1233  list *plist = get_paths(train_images);
1234 //int N = plist->size;
1235 char **paths = (char **)list_to_array(plist);
1236 
1237 load_args args = {0};
1238 args.w = net->w;
1239 args.h = net->h;
1240 args.paths = paths;
1241 args.n = imgs;
1242 args.m = plist->size;
1243 args.d = &buffer;
1244 
1245 args.min = net->min_crop;
1246 args.max = net->max_crop;
1247 args.angle = net->angle;
1248 args.aspect = net->aspect;
1249 args.exposure = net->exposure;
1250 args.saturation = net->saturation;
1251 args.hue = net->hue;
1252 args.size = net->w;
1253 args.type = CLASSIFICATION_DATA;
1254 args.classes = 1;
1255 char *ls[1] = {"coco"};
1256 args.labels = ls;
1257 
1258 pthread_t load_thread = load_data_in_thread(args);
1259 clock_t time;
1260 //while(i*imgs < N*120){
1261 while(get_current_batch(net) < net->max_batches){
1262 i += 1;
1263 time=clock();
1264 pthread_join(load_thread, 0);
1265 train = buffer;
1266 load_thread = load_data_in_thread(args);
1267 
1268 printf("Loaded: %lf seconds\n", sec(clock()-time));
1269 
1270 time=clock();
1271 float loss = train_network(net, train);
1272 if (avg_loss < 0) avg_loss = loss;
1273 avg_loss = avg_loss*.9 + loss*.1;
1274 
1275 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);
1276 if(i%1000==0){
1277 char buff[256];
1278 sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
1279 save_weights(net, buff);
1280 }
1281 if(i%100==0){
1282 char buff[256];
1283 sprintf(buff, "%s/%s.backup", backup_directory, base);
1284 save_weights(net, buff);
1285 }
1286 free_data(train);
1287 }
1288 char buff[256];
1289 sprintf(buff, "%s/%s_final.weights", backup_directory, base);
1290 save_weights(net, buff);
1291 }
1292 */
1293 
1294 void test_lsd(char *cfg, char *weights, char *filename, int gray)
1295 {
1296  network *net = load_network(cfg, weights, 0);
1297  set_batch_network(net, 1);
1298  srand(2222222);
1299 
1300  clock_t time;
1301  char buff[256];
1302  char *input = buff;
1303  int i, imlayer = 0;
1304 
1305  for (i = 0; i < net->n; ++i) {
1306  if (net->layers[i].out_c == 3) {
1307  imlayer = i;
1308  printf("%d\n", i);
1309  break;
1310  }
1311  }
1312 
1313  while(1){
1314  if(filename){
1315  strncpy(input, filename, 256);
1316  }else{
1317  printf("Enter Image Path: ");
1318  fflush(stdout);
1319  input = fgets(input, 256, stdin);
1320  if(!input) return;
1321  strtok(input, "\n");
1322  }
1323  image im = load_image_color(input, 0, 0);
1324  image resized = resize_min(im, net->w);
1325  image crop = crop_image(resized, (resized.w - net->w)/2, (resized.h - net->h)/2, net->w, net->h);
1326  if(gray) grayscale_image_3c(crop);
1327 
1328  float *X = crop.data;
1329  time=clock();
1330  network_predict(net, X);
1331  image out = get_network_image_layer(net, imlayer);
1332  //yuv_to_rgb(out);
1333  constrain_image(out);
1334  printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
1335  save_image(out, "out");
1336  show_image(out, "out", 1);
1337  show_image(crop, "crop", 0);
1338 
1339  free_image(im);
1340  free_image(resized);
1341  free_image(crop);
1342  if (filename) break;
1343  }
1344 }
1345 
1346 
1347 void run_lsd(int argc, char **argv)
1348 {
1349  if(argc < 4){
1350  fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
1351  return;
1352  }
1353 
1354  int clear = find_arg(argc, argv, "-clear");
1355  int display = find_arg(argc, argv, "-display");
1356  int batches = find_int_arg(argc, argv, "-b", 0);
1357  char *file = find_char_arg(argc, argv, "-file", "/home/pjreddie/data/imagenet/imagenet1k.train.list");
1358 
1359  char *cfg = argv[3];
1360  char *weights = (argc > 4) ? argv[4] : 0;
1361  char *filename = (argc > 5) ? argv[5] : 0;
1362  char *acfg = argv[5];
1363  char *aweights = (argc > 6) ? argv[6] : 0;
1364  //if(0==strcmp(argv[2], "train")) train_lsd(cfg, weights, clear);
1365  //else if(0==strcmp(argv[2], "train2")) train_lsd2(cfg, weights, acfg, aweights, clear);
1366  //else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear);
1367  //else if(0==strcmp(argv[2], "train3")) train_lsd3(argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], clear);
1368  if(0==strcmp(argv[2], "traingan")) train_dcgan(cfg, weights, acfg, aweights, clear, display, file, batches);
1369  else if(0==strcmp(argv[2], "trainprog")) train_prog(cfg, weights, acfg, aweights, clear, display, file, batches);
1370  else if(0==strcmp(argv[2], "traincolor")) train_colorizer(cfg, weights, acfg, aweights, clear, display);
1371  else if(0==strcmp(argv[2], "gan")) test_dcgan(cfg, weights);
1372  else if(0==strcmp(argv[2], "inter")) inter_dcgan(cfg, weights);
1373  else if(0==strcmp(argv[2], "test")) test_lsd(cfg, weights, filename, 0);
1374  else if(0==strcmp(argv[2], "color")) test_lsd(cfg, weights, filename, 1);
1375  /*
1376  else if(0==strcmp(argv[2], "valid")) validate_lsd(cfg, weights);
1377  */
1378 }
float decay
Definition: darknet.h:447
char ** paths
Definition: darknet.h:553
image copy_image(image p)
Definition: image.c:519
int batch
Definition: darknet.h:436
void scale_array(float *a, int n, float s)
Definition: utils.c:584
make_image
Definition: darknet.py:61
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
void set_batch_network(network *net, int b)
Definition: network.c:339
float learning_rate
Definition: darknet.h:445
float momentum
Definition: darknet.h:446
void free_data(data d)
Definition: data.c:665
float * truth
Definition: darknet.h:485
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
void axpy_gpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY)
void test_dcgan(char *cfgfile, char *weightfile)
Definition: lsd.c:469
Definition: darknet.h:512
void set_network_alpha_beta(network *net, float alpha, float beta)
Definition: lsd.c:505
void save_image(image p, const char *name)
Definition: image.c:717
void slerp(float *start, float *end, float s, int n, float *out)
Definition: lsd.c:387
data_type type
Definition: darknet.h:580
image float_to_image(int w, int h, int c, float *data)
Definition: image.c:774
void save_weights(network *net, char *filename)
Definition: parser.c:1080
float * delta
Definition: darknet.h:486
network_predict
Definition: darknet.py:79
int out_c
Definition: darknet.h:141
void fill_gpu(int N, float ALPHA, float *X, int INCX)
data concat_data(data d1, data d2)
Definition: data.c:1382
int h
Definition: darknet.h:514
int max_batches
Definition: darknet.h:453
void grayscale_image_3c(image im)
Definition: image.c:1194
void test_lsd(char *cfg, char *weights, char *filename, int gray)
Definition: lsd.c:1294
void train_dcgan(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images, int maxbatch)
Definition: lsd.c:672
image resize_min(image im, int min)
Definition: image.c:1001
int threads
Definition: darknet.h:552
void fill_cpu(int N, float ALPHA, float *X, int INCX)
Definition: blas.c:190
image get_network_image_layer(network *net, int i)
Definition: network.c:453
void scal_gpu(int N, float ALPHA, float *X, int INCX)
int m
Definition: darknet.h:556
layer * layers
Definition: darknet.h:441
int train
Definition: darknet.h:488
data * d
Definition: darknet.h:577
free_image
Definition: darknet.py:95
float * cost
Definition: darknet.h:490
int subdivisions
Definition: darknet.h:440
void forward_network(network *net)
Definition: network.c:188
float beta
Definition: darknet.h:186
void get_next_batch(data d, int n, int offset, float *X, float *y)
Definition: data.c:1459
void normalize_image(image p)
Definition: image.c:465
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_prog(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display, char *train_images, int maxbatch)
Definition: lsd.c:516
void constrain_image(image im)
Definition: image.c:456
void backward_network(network *net)
Definition: network.c:263
int classes
Definition: darknet.h:566
float get_current_rate(network *net)
Definition: network.c:90
int batch
Definition: darknet.h:131
float * output
Definition: darknet.h:246
void train_colorizer(char *cfg, char *weight, char *acfg, char *aweight, int clear, int display)
Definition: lsd.c:866
float sec(clock_t clocks)
Definition: utils.c:232
void copy_gpu(int N, float *X, int INCX, float *Y, int INCY)
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
image crop_image(image im, int dx, int dy, int w, int h)
Definition: image.c:861
float rand_normal()
Definition: utils.c:654
void * load_thread(void *ptr)
Definition: data.c:1090
int truths
Definition: darknet.h:466
int c
Definition: darknet.h:515
int w
Definition: darknet.h:513
float dot_cpu(int N, float *X, int INCX, float *Y, int INCY)
Definition: blas.c:297
float alpha
Definition: darknet.h:185
Definition: darknet.h:602
void copy_cpu(int N, float *X, int INCX, float *Y, int INCY)
Definition: blas.c:226
char ** labels
Definition: darknet.h:557
matrix X
Definition: darknet.h:540
void run_lsd(int argc, char **argv)
Definition: lsd.c:1347
int c
Definition: darknet.h:468
int outputs
Definition: darknet.h:465
LAYER_TYPE type
Definition: darknet.h:120
float * input
Definition: darknet.h:484
size_t get_current_batch(network *net)
Definition: network.c:63
float ** vals
Definition: darknet.h:534
int h
Definition: darknet.h:468
int n
Definition: darknet.h:435
list * get_paths(char *filename)
Definition: data.c:12
float * output
Definition: darknet.h:442
data copy_data(data d)
Definition: data.c:1592
int outputs
Definition: darknet.h:135
void inter_dcgan(char *cfgfile, char *weightfile)
Definition: lsd.c:411
float mag_array(float *a, int n)
Definition: utils.c:574
image random_unit_vector_image(int w, int h, int c)
Definition: lsd.c:399
int w
Definition: darknet.h:468
Definition: darknet.h:538
int inputs
Definition: darknet.h:464
Definition: darknet.h:119
float * data
Definition: darknet.h:516
matrix y
Definition: darknet.h:541