darknet  v3
nightmare.c
Go to the documentation of this file.
1 #include "darknet.h"
2 
3 #include <math.h>
4 
5 // ./darknet nightmare cfg/extractor.recon.cfg ~/trained/yolo-coco.conv frame6.png -reconstruct -iters 500 -i 3 -lambda .1 -rate .01 -smooth 2
6 
7 float abs_mean(float *x, int n)
8 {
9  int i;
10  float sum = 0;
11  for (i = 0; i < n; ++i){
12  sum += fabs(x[i]);
13  }
14  return sum/n;
15 }
16 
17 void calculate_loss(float *output, float *delta, int n, float thresh)
18 {
19  int i;
20  float mean = mean_array(output, n);
21  float var = variance_array(output, n);
22  for(i = 0; i < n; ++i){
23  if(delta[i] > mean + thresh*sqrt(var)) delta[i] = output[i];
24  else delta[i] = 0;
25  }
26 }
27 
28 void optimize_picture(network *net, image orig, int max_layer, float scale, float rate, float thresh, int norm)
29 {
30  //scale_image(orig, 2);
31  //translate_image(orig, -1);
32  net->n = max_layer + 1;
33 
34  int dx = rand()%16 - 8;
35  int dy = rand()%16 - 8;
36  int flip = rand()%2;
37 
38  image crop = crop_image(orig, dx, dy, orig.w, orig.h);
39  image im = resize_image(crop, (int)(orig.w * scale), (int)(orig.h * scale));
40  if(flip) flip_image(im);
41 
42  resize_network(net, im.w, im.h);
43  layer last = net->layers[net->n-1];
44  //net->layers[net->n - 1].activation = LINEAR;
45 
46  image delta = make_image(im.w, im.h, im.c);
47 
48 #ifdef GPU
49  net->delta_gpu = cuda_make_array(delta.data, im.w*im.h*im.c);
50  copy_cpu(net->inputs, im.data, 1, net->input, 1);
51 
52  forward_network_gpu(net);
53  copy_gpu(last.outputs, last.output_gpu, 1, last.delta_gpu, 1);
54 
55  cuda_pull_array(last.delta_gpu, last.delta, last.outputs);
56  calculate_loss(last.delta, last.delta, last.outputs, thresh);
57  cuda_push_array(last.delta_gpu, last.delta, last.outputs);
58 
59  backward_network_gpu(net);
60 
61  cuda_pull_array(net->delta_gpu, delta.data, im.w*im.h*im.c);
62  cuda_free(net->delta_gpu);
63  net->delta_gpu = 0;
64 #else
65  printf("\nnet: %d %d %d im: %d %d %d\n", net->w, net->h, net->inputs, im.w, im.h, im.c);
66  copy_cpu(net->inputs, im.data, 1, net->input, 1);
67  net->delta = delta.data;
68  forward_network(net);
69  copy_cpu(last.outputs, last.output, 1, last.delta, 1);
70  calculate_loss(last.output, last.delta, last.outputs, thresh);
71  backward_network(net);
72 #endif
73 
74  if(flip) flip_image(delta);
75  //normalize_array(delta.data, delta.w*delta.h*delta.c);
76  image resized = resize_image(delta, orig.w, orig.h);
77  image out = crop_image(resized, -dx, -dy, orig.w, orig.h);
78 
79  /*
80  image g = grayscale_image(out);
81  free_image(out);
82  out = g;
83  */
84 
85  //rate = rate / abs_mean(out.data, out.w*out.h*out.c);
86  image gray = make_image(out.w, out.h, out.c);
87  fill_image(gray, .5);
88  axpy_cpu(orig.w*orig.h*orig.c, -1, orig.data, 1, gray.data, 1);
89  axpy_cpu(orig.w*orig.h*orig.c, .1, gray.data, 1, out.data, 1);
90 
91  if(norm) normalize_array(out.data, out.w*out.h*out.c);
92  axpy_cpu(orig.w*orig.h*orig.c, rate, out.data, 1, orig.data, 1);
93 
94  /*
95  normalize_array(orig.data, orig.w*orig.h*orig.c);
96  scale_image(orig, sqrt(var));
97  translate_image(orig, mean);
98  */
99 
100  //translate_image(orig, 1);
101  //scale_image(orig, .5);
102  //normalize_image(orig);
103 
104  constrain_image(orig);
105 
106  free_image(crop);
107  free_image(im);
108  free_image(delta);
109  free_image(resized);
110  free_image(out);
111 
112 }
113 
114 void smooth(image recon, image update, float lambda, int num)
115 {
116  int i, j, k;
117  int ii, jj;
118  for(k = 0; k < recon.c; ++k){
119  for(j = 0; j < recon.h; ++j){
120  for(i = 0; i < recon.w; ++i){
121  int out_index = i + recon.w*(j + recon.h*k);
122  for(jj = j-num; jj <= j + num && jj < recon.h; ++jj){
123  if (jj < 0) continue;
124  for(ii = i-num; ii <= i + num && ii < recon.w; ++ii){
125  if (ii < 0) continue;
126  int in_index = ii + recon.w*(jj + recon.h*k);
127  update.data[out_index] += lambda * (recon.data[in_index] - recon.data[out_index]);
128  }
129  }
130  }
131  }
132  }
133 }
134 
135 void reconstruct_picture(network *net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size, int iters)
136 {
137  int iter = 0;
138  for (iter = 0; iter < iters; ++iter) {
139  image delta = make_image(recon.w, recon.h, recon.c);
140 
141 #ifdef GPU
143  cuda_push_array(net->input_gpu, recon.data, recon.w*recon.h*recon.c);
144  //cuda_push_array(net->truth_gpu, features, net->truths);
145  net->delta_gpu = cuda_make_array(delta.data, delta.w*delta.h*delta.c);
146 
147  forward_network_gpu(net);
148  cuda_push_array(l.delta_gpu, features, l.outputs);
149  axpy_gpu(l.outputs, -1, l.output_gpu, 1, l.delta_gpu, 1);
150  backward_network_gpu(net);
151 
152  cuda_pull_array(net->delta_gpu, delta.data, delta.w*delta.h*delta.c);
153 
154  cuda_free(net->delta_gpu);
155 #else
156  net->input = recon.data;
157  net->delta = delta.data;
158  net->truth = features;
159 
160  forward_network(net);
161  backward_network(net);
162 #endif
163 
164  //normalize_array(delta.data, delta.w*delta.h*delta.c);
165  axpy_cpu(recon.w*recon.h*recon.c, 1, delta.data, 1, update.data, 1);
166  //smooth(recon, update, lambda, smooth_size);
167 
168  axpy_cpu(recon.w*recon.h*recon.c, rate, update.data, 1, recon.data, 1);
169  scal_cpu(recon.w*recon.h*recon.c, momentum, update.data, 1);
170 
171  float mag = mag_array(delta.data, recon.w*recon.h*recon.c);
172  printf("mag: %f\n", mag);
173  //scal_cpu(recon.w*recon.h*recon.c, 600/mag, recon.data, 1);
174 
175  constrain_image(recon);
176  free_image(delta);
177  }
178 }
179 
180 /*
181 void run_lsd(int argc, char **argv)
182 {
183  srand(0);
184  if(argc < 3){
185  fprintf(stderr, "usage: %s %s [cfg] [weights] [image] [options! (optional)]\n", argv[0], argv[1]);
186  return;
187  }
188 
189  char *cfg = argv[2];
190  char *weights = argv[3];
191  char *input = argv[4];
192 
193  int norm = find_int_arg(argc, argv, "-norm", 1);
194  int rounds = find_int_arg(argc, argv, "-rounds", 1);
195  int iters = find_int_arg(argc, argv, "-iters", 10);
196  float rate = find_float_arg(argc, argv, "-rate", .04);
197  float momentum = find_float_arg(argc, argv, "-momentum", .9);
198  float lambda = find_float_arg(argc, argv, "-lambda", .01);
199  char *prefix = find_char_arg(argc, argv, "-prefix", 0);
200  int reconstruct = find_arg(argc, argv, "-reconstruct");
201  int smooth_size = find_int_arg(argc, argv, "-smooth", 1);
202 
203  network net = parse_network_cfg(cfg);
204  load_weights(&net, weights);
205  char *cfgbase = basecfg(cfg);
206  char *imbase = basecfg(input);
207 
208  set_batch_network(&net, 1);
209  image im = load_image_color(input, 0, 0);
210 
211  float *features = 0;
212  image update;
213  if (reconstruct){
214  im = letterbox_image(im, net->w, net->h);
215 
216  int zz = 0;
217  network_predict(net, im.data);
218  image out_im = get_network_image(net);
219  image crop = crop_image(out_im, zz, zz, out_im.w-2*zz, out_im.h-2*zz);
220  //flip_image(crop);
221  image f_im = resize_image(crop, out_im.w, out_im.h);
222  free_image(crop);
223  printf("%d features\n", out_im.w*out_im.h*out_im.c);
224 
225 
226  im = resize_image(im, im.w, im.h);
227  f_im = resize_image(f_im, f_im.w, f_im.h);
228  features = f_im.data;
229 
230  int i;
231  for(i = 0; i < 14*14*512; ++i){
232  features[i] += rand_uniform(-.19, .19);
233  }
234 
235  free_image(im);
236  im = make_random_image(im.w, im.h, im.c);
237  update = make_image(im.w, im.h, im.c);
238 
239  }
240 
241  int e;
242  int n;
243  for(e = 0; e < rounds; ++e){
244  fprintf(stderr, "Iteration: ");
245  fflush(stderr);
246  for(n = 0; n < iters; ++n){
247  fprintf(stderr, "%d, ", n);
248  fflush(stderr);
249  if(reconstruct){
250  reconstruct_picture(net, features, im, update, rate, momentum, lambda, smooth_size, 1);
251  //if ((n+1)%30 == 0) rate *= .5;
252  show_image(im, "reconstruction");
253 #ifdef OPENCV
254  cvWaitKey(10);
255 #endif
256  }else{
257  int layer = max_layer + rand()%range - range/2;
258  int octave = rand()%octaves;
259  optimize_picture(&net, im, layer, 1/pow(1.33333333, octave), rate, thresh, norm);
260  }
261  }
262  fprintf(stderr, "done\n");
263  char buff[256];
264  if (prefix){
265  sprintf(buff, "%s/%s_%s_%d_%06d",prefix, imbase, cfgbase, max_layer, e);
266  }else{
267  sprintf(buff, "%s_%s_%d_%06d",imbase, cfgbase, max_layer, e);
268  }
269  printf("%d %s\n", e, buff);
270  save_image(im, buff);
271  //show_image(im, buff);
272  //cvWaitKey(0);
273 
274  if(rotate){
275  image rot = rotate_image(im, rotate);
276  free_image(im);
277  im = rot;
278  }
279  image crop = crop_image(im, im.w * (1. - zoom)/2., im.h * (1.-zoom)/2., im.w*zoom, im.h*zoom);
280  image resized = resize_image(crop, im.w, im.h);
281  free_image(im);
282  free_image(crop);
283  im = resized;
284  }
285 }
286 */
287 
288 void run_nightmare(int argc, char **argv)
289 {
290  srand(0);
291  if(argc < 4){
292  fprintf(stderr, "usage: %s %s [cfg] [weights] [image] [layer] [options! (optional)]\n", argv[0], argv[1]);
293  return;
294  }
295 
296  char *cfg = argv[2];
297  char *weights = argv[3];
298  char *input = argv[4];
299  int max_layer = atoi(argv[5]);
300 
301  int range = find_int_arg(argc, argv, "-range", 1);
302  int norm = find_int_arg(argc, argv, "-norm", 1);
303  int rounds = find_int_arg(argc, argv, "-rounds", 1);
304  int iters = find_int_arg(argc, argv, "-iters", 10);
305  int octaves = find_int_arg(argc, argv, "-octaves", 4);
306  float zoom = find_float_arg(argc, argv, "-zoom", 1.);
307  float rate = find_float_arg(argc, argv, "-rate", .04);
308  float thresh = find_float_arg(argc, argv, "-thresh", 1.);
309  float rotate = find_float_arg(argc, argv, "-rotate", 0);
310  float momentum = find_float_arg(argc, argv, "-momentum", .9);
311  float lambda = find_float_arg(argc, argv, "-lambda", .01);
312  char *prefix = find_char_arg(argc, argv, "-prefix", 0);
313  int reconstruct = find_arg(argc, argv, "-reconstruct");
314  int smooth_size = find_int_arg(argc, argv, "-smooth", 1);
315 
316  network *net = load_network(cfg, weights, 0);
317  char *cfgbase = basecfg(cfg);
318  char *imbase = basecfg(input);
319 
320  set_batch_network(net, 1);
321  image im = load_image_color(input, 0, 0);
322  if(0){
323  float scale = 1;
324  if(im.w > 512 || im.h > 512){
325  if(im.w > im.h) scale = 512.0/im.w;
326  else scale = 512.0/im.h;
327  }
328  image resized = resize_image(im, scale*im.w, scale*im.h);
329  free_image(im);
330  im = resized;
331  }
332  //im = letterbox_image(im, net->w, net->h);
333 
334  float *features = 0;
335  image update;
336  if (reconstruct){
337  net->n = max_layer;
338  im = letterbox_image(im, net->w, net->h);
339  //resize_network(&net, im.w, im.h);
340 
341  network_predict(net, im.data);
342  if(net->layers[net->n-1].type == REGION){
343  printf("region!\n");
344  zero_objectness(net->layers[net->n-1]);
345  }
346  image out_im = copy_image(get_network_image(net));
347  /*
348  image crop = crop_image(out_im, zz, zz, out_im.w-2*zz, out_im.h-2*zz);
349  //flip_image(crop);
350  image f_im = resize_image(crop, out_im.w, out_im.h);
351  free_image(crop);
352  */
353  printf("%d features\n", out_im.w*out_im.h*out_im.c);
354 
355  features = out_im.data;
356 
357  /*
358  int i;
359  for(i = 0; i < 14*14*512; ++i){
360  //features[i] += rand_uniform(-.19, .19);
361  }
362  free_image(im);
363  im = make_random_image(im.w, im.h, im.c);
364  */
365  update = make_image(im.w, im.h, im.c);
366  }
367 
368  int e;
369  int n;
370  for(e = 0; e < rounds; ++e){
371  fprintf(stderr, "Iteration: ");
372  fflush(stderr);
373  for(n = 0; n < iters; ++n){
374  fprintf(stderr, "%d, ", n);
375  fflush(stderr);
376  if(reconstruct){
377  reconstruct_picture(net, features, im, update, rate, momentum, lambda, smooth_size, 1);
378  //if ((n+1)%30 == 0) rate *= .5;
379  show_image(im, "reconstruction", 10);
380  }else{
381  int layer = max_layer + rand()%range - range/2;
382  int octave = rand()%octaves;
383  optimize_picture(net, im, layer, 1/pow(1.33333333, octave), rate, thresh, norm);
384  }
385  }
386  fprintf(stderr, "done\n");
387  if(0){
388  image g = grayscale_image(im);
389  free_image(im);
390  im = g;
391  }
392  char buff[256];
393  if (prefix){
394  sprintf(buff, "%s/%s_%s_%d_%06d",prefix, imbase, cfgbase, max_layer, e);
395  }else{
396  sprintf(buff, "%s_%s_%d_%06d",imbase, cfgbase, max_layer, e);
397  }
398  printf("%d %s\n", e, buff);
399  save_image(im, buff);
400  //show_image(im, buff, 0);
401 
402  if(rotate){
403  image rot = rotate_image(im, rotate);
404  free_image(im);
405  im = rot;
406  }
407  image crop = crop_image(im, im.w * (1. - zoom)/2., im.h * (1.-zoom)/2., im.w*zoom, im.h*zoom);
408  image resized = resize_image(crop, im.w, im.h);
409  free_image(im);
410  free_image(crop);
411  im = resized;
412  }
413 }
414 
void normalize_array(float *a, int n)
Definition: utils.c:554
float abs_mean(float *x, int n)
Definition: nightmare.c:7
image resize_image(image im, int w, int h)
Definition: image.c:1351
image copy_image(image p)
Definition: image.c:519
make_image
Definition: darknet.py:61
int find_arg(int argc, char *argv[], char *arg)
Definition: utils.c:120
float variance_array(float *a, int n)
Definition: utils.c:514
void optimize_picture(network *net, image orig, int max_layer, float scale, float rate, float thresh, int norm)
Definition: nightmare.c:28
Definition: darknet.h:87
void set_batch_network(network *net, int b)
Definition: network.c:339
void run_nightmare(int argc, char **argv)
Definition: nightmare.c:288
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
image grayscale_image(image im)
Definition: image.c:1212
layer get_network_output_layer(network *net)
Definition: network.c:699
void reconstruct_picture(network *net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size, int iters)
Definition: nightmare.c:135
void axpy_gpu(int N, float ALPHA, float *X, int INCX, float *Y, int INCY)
Definition: darknet.h:512
void save_image(image p, const char *name)
Definition: image.c:717
void flip_image(image a)
Definition: image.c:349
float * delta
Definition: darknet.h:486
void fill_image(image m, float s)
Definition: image.c:843
network_predict
Definition: darknet.py:79
image get_network_image(network *net)
Definition: network.c:466
int h
Definition: darknet.h:514
int resize_network(network *net, int w, int h)
Definition: network.c:358
letterbox_image
Definition: darknet.py:98
layer * layers
Definition: darknet.h:441
free_image
Definition: darknet.py:95
float mean_array(float *a, int n)
Definition: utils.c:487
image rotate_image(image m, float rad)
Definition: image.c:824
float * delta
Definition: darknet.h:245
void forward_network(network *net)
Definition: network.c:188
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
float find_float_arg(int argc, char **argv, char *arg, float def)
Definition: utils.c:148
void constrain_image(image im)
Definition: image.c:456
void backward_network(network *net)
Definition: network.c:263
float * output
Definition: darknet.h:246
void scal_cpu(int N, float ALPHA, float *X, int INCX)
Definition: blas.c:184
void smooth(image recon, image update, float lambda, int num)
Definition: nightmare.c:114
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
image crop_image(image im, int dx, int dy, int w, int h)
Definition: image.c:861
void calculate_loss(float *output, float *delta, int n, float thresh)
Definition: nightmare.c:17
int c
Definition: darknet.h:515
int w
Definition: darknet.h:513
void copy_cpu(int N, float *X, int INCX, float *Y, int INCY)
Definition: blas.c:226
LAYER_TYPE type
Definition: darknet.h:120
float * input
Definition: darknet.h:484
void zero_objectness(layer l)
Definition: region_layer.c:497
int h
Definition: darknet.h:468
int n
Definition: darknet.h:435
int outputs
Definition: darknet.h:135
float mag_array(float *a, int n)
Definition: utils.c:574
int w
Definition: darknet.h:468
int inputs
Definition: darknet.h:464
Definition: darknet.h:119
float * data
Definition: darknet.h:516