nightmare.c 13 KB

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