From 0dab894a5be9f7d10d85e89dea91d02c71bae84d Mon Sep 17 00:00:00 2001
From: Edmond Yoo <hj3yoo@uwaterloo.ca>
Date: Sun, 16 Sep 2018 03:24:45 +0000
Subject: [PATCH] Moving files from MTGCardDetector repo

---
 src/nightmare.c |   90 ++++++++++++++++++++++++---------------------
 1 files changed, 48 insertions(+), 42 deletions(-)

diff --git a/src/nightmare.c b/src/nightmare.c
index bc2060f..ec7166c 100644
--- a/src/nightmare.c
+++ b/src/nightmare.c
@@ -8,12 +8,14 @@
 #include "opencv2/highgui/highgui_c.h"
 #endif
 
+// ./darknet nightmare cfg/extractor.recon.cfg ~/trained/yolo-coco.conv frame6.png -reconstruct -iters 500 -i 3 -lambda .1 -rate .01 -smooth 2
+
 float abs_mean(float *x, int n)
 {
     int i;
     float sum = 0;
     for (i = 0; i < n; ++i){
-        sum += abs(x[i]);
+        sum += fabs(x[i]);
     }
     return sum/n;
 }
@@ -31,8 +33,8 @@
 
 void optimize_picture(network *net, image orig, int max_layer, float scale, float rate, float thresh, int norm)
 {
-    scale_image(orig, 2);
-    translate_image(orig, -1);
+    //scale_image(orig, 2);
+    //translate_image(orig, -1);
     net->n = max_layer + 1;
 
     int dx = rand()%16 - 8;
@@ -98,8 +100,8 @@
        translate_image(orig, mean);
      */
 
-    translate_image(orig, 1);
-    scale_image(orig, .5);
+    //translate_image(orig, 1);
+    //scale_image(orig, .5);
     //normalize_image(orig);
 
     constrain_image(orig);
@@ -133,50 +135,47 @@
     }
 }
 
-void reconstruct_picture(network net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size)
+void reconstruct_picture(network net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size, int iters)
 {
-    scale_image(recon, 2);
-    translate_image(recon, -1);
+    int iter = 0;
+    for (iter = 0; iter < iters; ++iter) {
+        image delta = make_image(recon.w, recon.h, recon.c);
 
-    image delta = make_image(recon.w, recon.h, recon.c);
-
-    network_state state = {0};
+        network_state state = {0};
 #ifdef GPU
-    state.input = cuda_make_array(recon.data, recon.w*recon.h*recon.c);
-    state.delta = cuda_make_array(delta.data, delta.w*delta.h*delta.c);
-    state.truth = cuda_make_array(features, get_network_output_size(net));
+        state.input = cuda_make_array(recon.data, recon.w*recon.h*recon.c);
+        state.delta = cuda_make_array(delta.data, delta.w*delta.h*delta.c);
+        state.truth = cuda_make_array(features, get_network_output_size(net));
 
-    forward_network_gpu(net, state);
-    backward_network_gpu(net, state);
+        forward_network_gpu(net, state);
+        backward_network_gpu(net, state);
 
-    cuda_pull_array(state.delta, delta.data, delta.w*delta.h*delta.c);
+        cuda_pull_array(state.delta, delta.data, delta.w*delta.h*delta.c);
 
-    cuda_free(state.input);
-    cuda_free(state.delta);
-    cuda_free(state.truth);
+        cuda_free(state.input);
+        cuda_free(state.delta);
+        cuda_free(state.truth);
 #else
-    state.input = recon.data;
-    state.delta = delta.data;
-    state.truth = features;
+        state.input = recon.data;
+        state.delta = delta.data;
+        state.truth = features;
 
-    forward_network(net, state);
-    backward_network(net, state);
+        forward_network(net, state);
+        backward_network(net, state);
 #endif
 
-    axpy_cpu(recon.w*recon.h*recon.c, 1, delta.data, 1, update.data, 1);
-    smooth(recon, update, lambda, smooth_size);
+        axpy_cpu(recon.w*recon.h*recon.c, 1, delta.data, 1, update.data, 1);
+        smooth(recon, update, lambda, smooth_size);
 
-    axpy_cpu(recon.w*recon.h*recon.c, rate, update.data, 1, recon.data, 1);
-    scal_cpu(recon.w*recon.h*recon.c, momentum, update.data, 1);
+        axpy_cpu(recon.w*recon.h*recon.c, rate, update.data, 1, recon.data, 1);
+        scal_cpu(recon.w*recon.h*recon.c, momentum, update.data, 1);
 
-    translate_image(recon, 1);
-    scale_image(recon, .5);
+        //float mag = mag_array(recon.data, recon.w*recon.h*recon.c);
+        //scal_cpu(recon.w*recon.h*recon.c, 600/mag, recon.data, 1);
 
-    float mag = mag_array(recon.data, recon.w*recon.h*recon.c);
-    scal_cpu(recon.w*recon.h*recon.c, 600/mag, recon.data, 1);
-
-    constrain_image(recon);
-    free_image(delta);
+        constrain_image(recon);
+        free_image(delta);
+    }
 }
 
 
@@ -226,7 +225,7 @@
         im = resized;
     }
 
-    float *features;
+    float *features = 0;
     image update;
     if (reconstruct){
         resize_network(&net, im.w, im.h);
@@ -241,13 +240,19 @@
         printf("%d features\n", out_im.w*out_im.h*out_im.c);
 
 
-        im = resize_image(im, im.w*2, im.h);
-        f_im = resize_image(f_im, f_im.w*2, f_im.h);
+        im = resize_image(im, im.w, im.h);
+        f_im = resize_image(f_im, f_im.w, f_im.h);
         features = f_im.data;
 
+        int i;
+        for(i = 0; i < 14*14*512; ++i){
+            features[i] += rand_uniform(-.19, .19);
+        }
+
         free_image(im);
         im = make_random_image(im.w, im.h, im.c);
         update = make_image(im.w, im.h, im.c);
+
     }
 
     int e;
@@ -259,11 +264,12 @@
             fprintf(stderr, "%d, ", n);
             fflush(stderr);
             if(reconstruct){
-                reconstruct_picture(net, features, im, update, rate, momentum, lambda, smooth_size);
+                reconstruct_picture(net, features, im, update, rate, momentum, lambda, smooth_size, 1);
+                //if ((n+1)%30 == 0) rate *= .5;
                 show_image(im, "reconstruction");
-                #ifdef OPENCV
+#ifdef OPENCV
                 cvWaitKey(10);
-                #endif
+#endif
             }else{
                 int layer = max_layer + rand()%range - range/2;
                 int octave = rand()%octaves;

--
Gitblit v1.10.0