From 168af40fe9a3cc81c6ee16b3e81f154780c36bdb Mon Sep 17 00:00:00 2001
From: Scheaven <xuepengqiang>
Date: 星期四, 03 六月 2021 15:03:27 +0800
Subject: [PATCH] up new v4

---
 lib/detecter_tools/darknet/nightmare.c |  606 +++++++++++++++++++++++++++---------------------------
 1 files changed, 303 insertions(+), 303 deletions(-)

diff --git a/lib/detecter_tools/darknet/nightmare.c b/lib/detecter_tools/darknet/nightmare.c
index afb9ae1..5c1ca04 100644
--- a/lib/detecter_tools/darknet/nightmare.c
+++ b/lib/detecter_tools/darknet/nightmare.c
@@ -1,303 +1,303 @@
-
-#include "network.h"
-#include "parser.h"
-#include "blas.h"
-#include "utils.h"
-
-// ./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 += fabs(x[i]);
-    }
-    return sum/n;
-}
-
-void calculate_loss(float *output, float *delta, int n, float thresh)
-{
-    int i;
-    float mean = mean_array(output, n);
-    float var = variance_array(output, n);
-    for(i = 0; i < n; ++i){
-        if(delta[i] > mean + thresh*sqrt(var)) delta[i] = output[i];
-        else delta[i] = 0;
-    }
-}
-
-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);
-    net->n = max_layer + 1;
-
-    int dx = rand()%16 - 8;
-    int dy = rand()%16 - 8;
-    int flip = rand()%2;
-
-    image crop = crop_image(orig, dx, dy, orig.w, orig.h);
-    image im = resize_image(crop, (int)(orig.w * scale), (int)(orig.h * scale));
-    if(flip) flip_image(im);
-
-    resize_network(net, im.w, im.h);
-    layer last = net->layers[net->n-1];
-    //net->layers[net->n - 1].activation = LINEAR;
-
-    image delta = make_image(im.w, im.h, im.c);
-
-    network_state state = {0};
-
-#ifdef GPU
-    state.input = cuda_make_array(im.data, im.w*im.h*im.c);
-    state.delta = cuda_make_array(im.data, im.w*im.h*im.c);
-
-    forward_network_gpu(*net, state);
-    copy_ongpu(last.outputs, last.output_gpu, 1, last.delta_gpu, 1);
-
-    cuda_pull_array(last.delta_gpu, last.delta, last.outputs);
-    calculate_loss(last.delta, last.delta, last.outputs, thresh);
-    cuda_push_array(last.delta_gpu, last.delta, last.outputs);
-
-    backward_network_gpu(*net, state);
-
-    cuda_pull_array(state.delta, delta.data, im.w*im.h*im.c);
-    cuda_free(state.input);
-    cuda_free(state.delta);
-#else
-    state.input = im.data;
-    state.delta = delta.data;
-    forward_network(*net, state);
-    copy_cpu(last.outputs, last.output, 1, last.delta, 1);
-    calculate_loss(last.output, last.delta, last.outputs, thresh);
-    backward_network(*net, state);
-#endif
-
-    if(flip) flip_image(delta);
-    //normalize_array(delta.data, delta.w*delta.h*delta.c);
-    image resized = resize_image(delta, orig.w, orig.h);
-    image out = crop_image(resized, -dx, -dy, orig.w, orig.h);
-
-    /*
-       image g = grayscale_image(out);
-       free_image(out);
-       out = g;
-     */
-
-    //rate = rate / abs_mean(out.data, out.w*out.h*out.c);
-
-    if(norm) normalize_array(out.data, out.w*out.h*out.c);
-    axpy_cpu(orig.w*orig.h*orig.c, rate, out.data, 1, orig.data, 1);
-
-    /*
-       normalize_array(orig.data, orig.w*orig.h*orig.c);
-       scale_image(orig, sqrt(var));
-       translate_image(orig, mean);
-     */
-
-    //translate_image(orig, 1);
-    //scale_image(orig, .5);
-    //normalize_image(orig);
-
-    constrain_image(orig);
-
-    free_image(crop);
-    free_image(im);
-    free_image(delta);
-    free_image(resized);
-    free_image(out);
-
-}
-
-void smooth(image recon, image update, float lambda, int num)
-{
-    int i, j, k;
-    int ii, jj;
-    for(k = 0; k < recon.c; ++k){
-        for(j = 0; j < recon.h; ++j){
-            for(i = 0; i < recon.w; ++i){
-                int out_index = i + recon.w*(j + recon.h*k);
-                for(jj = j-num; jj <= j + num && jj < recon.h; ++jj){
-                    if (jj < 0) continue;
-                    for(ii = i-num; ii <= i + num && ii < recon.w; ++ii){
-                        if (ii < 0) continue;
-                        int in_index = ii + recon.w*(jj + recon.h*k);
-                        update.data[out_index] += lambda * (recon.data[in_index] - recon.data[out_index]);
-                    }
-                }
-            }
-        }
-    }
-}
-
-void reconstruct_picture(network net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size, int iters)
-{
-    int iter = 0;
-    for (iter = 0; iter < iters; ++iter) {
-        image delta = make_image(recon.w, recon.h, recon.c);
-
-        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));
-
-        forward_network_gpu(net, state);
-        backward_network_gpu(net, state);
-
-        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);
-#else
-        state.input = recon.data;
-        state.delta = delta.data;
-        state.truth = features;
-
-        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, rate, update.data, 1, recon.data, 1);
-        scal_cpu(recon.w*recon.h*recon.c, momentum, update.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);
-    }
-}
-
-
-void run_nightmare(int argc, char **argv)
-{
-    srand(time(0));
-    if(argc < 4){
-        fprintf(stderr, "usage: %s %s [cfg] [weights] [image] [layer] [options! (optional)]\n", argv[0], argv[1]);
-        return;
-    }
-
-    char *cfg = argv[2];
-    char *weights = argv[3];
-    char *input = argv[4];
-    int max_layer = atoi(argv[5]);
-
-    int range = find_int_arg(argc, argv, "-range", 1);
-    int norm = find_int_arg(argc, argv, "-norm", 1);
-    int rounds = find_int_arg(argc, argv, "-rounds", 1);
-    int iters = find_int_arg(argc, argv, "-iters", 10);
-    int octaves = find_int_arg(argc, argv, "-octaves", 4);
-    float zoom = find_float_arg(argc, argv, "-zoom", 1.);
-    float rate = find_float_arg(argc, argv, "-rate", .04);
-    float thresh = find_float_arg(argc, argv, "-thresh", 1.);
-    float rotate = find_float_arg(argc, argv, "-rotate", 0);
-    float momentum = find_float_arg(argc, argv, "-momentum", .9);
-    float lambda = find_float_arg(argc, argv, "-lambda", .01);
-    char *prefix = find_char_arg(argc, argv, "-prefix", 0);
-    int reconstruct = find_arg(argc, argv, "-reconstruct");
-    int smooth_size = find_int_arg(argc, argv, "-smooth", 1);
-
-    network net = parse_network_cfg(cfg);
-    load_weights(&net, weights);
-    char *cfgbase = basecfg(cfg);
-    char *imbase = basecfg(input);
-
-    set_batch_network(&net, 1);
-    image im = load_image_color(input, 0, 0);
-    if(0){
-        float scale = 1;
-        if(im.w > 512 || im.h > 512){
-            if(im.w > im.h) scale = 512.0/im.w;
-            else scale = 512.0/im.h;
-        }
-        image resized = resize_image(im, scale*im.w, scale*im.h);
-        free_image(im);
-        im = resized;
-    }
-
-    float *features = 0;
-    image update;
-    if (reconstruct){
-        resize_network(&net, im.w, im.h);
-
-        int zz = 0;
-        network_predict(net, im.data);
-        image out_im = get_network_image(net);
-        image crop = crop_image(out_im, zz, zz, out_im.w-2*zz, out_im.h-2*zz);
-        //flip_image(crop);
-        image f_im = resize_image(crop, out_im.w, out_im.h);
-        free_image(crop);
-        printf("%d features\n", out_im.w*out_im.h*out_im.c);
-
-
-        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;
-    int n;
-    for(e = 0; e < rounds; ++e){
-        fprintf(stderr, "Iteration: ");
-        fflush(stderr);
-        for(n = 0; n < iters; ++n){
-            fprintf(stderr, "%d, ", n);
-            fflush(stderr);
-            if(reconstruct){
-                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
-                wait_key_cv(10);
-#endif
-            }else{
-                int layer = max_layer + rand()%range - range/2;
-                int octave = rand()%octaves;
-                optimize_picture(&net, im, layer, 1/pow(1.33333333, octave), rate, thresh, norm);
-            }
-        }
-        fprintf(stderr, "done\n");
-        if(0){
-            image g = grayscale_image(im);
-            free_image(im);
-            im = g;
-        }
-        char buff[256];
-        if (prefix){
-            sprintf(buff, "%s/%s_%s_%d_%06d",prefix, imbase, cfgbase, max_layer, e);
-        }else{
-            sprintf(buff, "%s_%s_%d_%06d",imbase, cfgbase, max_layer, e);
-        }
-        printf("%d %s\n", e, buff);
-        save_image(im, buff);
-        //show_image(im, buff);
-        //wait_key_cv(0);
-
-        if(rotate){
-            image rot = rotate_image(im, rotate);
-            free_image(im);
-            im = rot;
-        }
-        image crop = crop_image(im, im.w * (1. - zoom)/2., im.h * (1.-zoom)/2., im.w*zoom, im.h*zoom);
-        image resized = resize_image(crop, im.w, im.h);
-        free_image(im);
-        free_image(crop);
-        im = resized;
-    }
-}
+
+#include "network.h"
+#include "parser.h"
+#include "blas.h"
+#include "utils.h"
+
+// ./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 += fabs(x[i]);
+    }
+    return sum/n;
+}
+
+void calculate_loss(float *output, float *delta, int n, float thresh)
+{
+    int i;
+    float mean = mean_array(output, n);
+    float var = variance_array(output, n);
+    for(i = 0; i < n; ++i){
+        if(delta[i] > mean + thresh*sqrt(var)) delta[i] = output[i];
+        else delta[i] = 0;
+    }
+}
+
+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);
+    net->n = max_layer + 1;
+
+    int dx = rand()%16 - 8;
+    int dy = rand()%16 - 8;
+    int flip = rand()%2;
+
+    image crop = crop_image(orig, dx, dy, orig.w, orig.h);
+    image im = resize_image(crop, (int)(orig.w * scale), (int)(orig.h * scale));
+    if(flip) flip_image(im);
+
+    resize_network(net, im.w, im.h);
+    layer last = net->layers[net->n-1];
+    //net->layers[net->n - 1].activation = LINEAR;
+
+    image delta = make_image(im.w, im.h, im.c);
+
+    network_state state = {0};
+
+#ifdef GPU
+    state.input = cuda_make_array(im.data, im.w*im.h*im.c);
+    state.delta = cuda_make_array(im.data, im.w*im.h*im.c);
+
+    forward_network_gpu(*net, state);
+    copy_ongpu(last.outputs, last.output_gpu, 1, last.delta_gpu, 1);
+
+    cuda_pull_array(last.delta_gpu, last.delta, last.outputs);
+    calculate_loss(last.delta, last.delta, last.outputs, thresh);
+    cuda_push_array(last.delta_gpu, last.delta, last.outputs);
+
+    backward_network_gpu(*net, state);
+
+    cuda_pull_array(state.delta, delta.data, im.w*im.h*im.c);
+    cuda_free(state.input);
+    cuda_free(state.delta);
+#else
+    state.input = im.data;
+    state.delta = delta.data;
+    forward_network(*net, state);
+    copy_cpu(last.outputs, last.output, 1, last.delta, 1);
+    calculate_loss(last.output, last.delta, last.outputs, thresh);
+    backward_network(*net, state);
+#endif
+
+    if(flip) flip_image(delta);
+    //normalize_array(delta.data, delta.w*delta.h*delta.c);
+    image resized = resize_image(delta, orig.w, orig.h);
+    image out = crop_image(resized, -dx, -dy, orig.w, orig.h);
+
+    /*
+       image g = grayscale_image(out);
+       free_image(out);
+       out = g;
+     */
+
+    //rate = rate / abs_mean(out.data, out.w*out.h*out.c);
+
+    if(norm) normalize_array(out.data, out.w*out.h*out.c);
+    axpy_cpu(orig.w*orig.h*orig.c, rate, out.data, 1, orig.data, 1);
+
+    /*
+       normalize_array(orig.data, orig.w*orig.h*orig.c);
+       scale_image(orig, sqrt(var));
+       translate_image(orig, mean);
+     */
+
+    //translate_image(orig, 1);
+    //scale_image(orig, .5);
+    //normalize_image(orig);
+
+    constrain_image(orig);
+
+    free_image(crop);
+    free_image(im);
+    free_image(delta);
+    free_image(resized);
+    free_image(out);
+
+}
+
+void smooth(image recon, image update, float lambda, int num)
+{
+    int i, j, k;
+    int ii, jj;
+    for(k = 0; k < recon.c; ++k){
+        for(j = 0; j < recon.h; ++j){
+            for(i = 0; i < recon.w; ++i){
+                int out_index = i + recon.w*(j + recon.h*k);
+                for(jj = j-num; jj <= j + num && jj < recon.h; ++jj){
+                    if (jj < 0) continue;
+                    for(ii = i-num; ii <= i + num && ii < recon.w; ++ii){
+                        if (ii < 0) continue;
+                        int in_index = ii + recon.w*(jj + recon.h*k);
+                        update.data[out_index] += lambda * (recon.data[in_index] - recon.data[out_index]);
+                    }
+                }
+            }
+        }
+    }
+}
+
+void reconstruct_picture(network net, float *features, image recon, image update, float rate, float momentum, float lambda, int smooth_size, int iters)
+{
+    int iter = 0;
+    for (iter = 0; iter < iters; ++iter) {
+        image delta = make_image(recon.w, recon.h, recon.c);
+
+        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));
+
+        forward_network_gpu(net, state);
+        backward_network_gpu(net, state);
+
+        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);
+#else
+        state.input = recon.data;
+        state.delta = delta.data;
+        state.truth = features;
+
+        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, rate, update.data, 1, recon.data, 1);
+        scal_cpu(recon.w*recon.h*recon.c, momentum, update.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);
+    }
+}
+
+
+void run_nightmare(int argc, char **argv)
+{
+    srand(time(0));
+    if(argc < 4){
+        fprintf(stderr, "usage: %s %s [cfg] [weights] [image] [layer] [options! (optional)]\n", argv[0], argv[1]);
+        return;
+    }
+
+    char *cfg = argv[2];
+    char *weights = argv[3];
+    char *input = argv[4];
+    int max_layer = atoi(argv[5]);
+
+    int range = find_int_arg(argc, argv, "-range", 1);
+    int norm = find_int_arg(argc, argv, "-norm", 1);
+    int rounds = find_int_arg(argc, argv, "-rounds", 1);
+    int iters = find_int_arg(argc, argv, "-iters", 10);
+    int octaves = find_int_arg(argc, argv, "-octaves", 4);
+    float zoom = find_float_arg(argc, argv, "-zoom", 1.);
+    float rate = find_float_arg(argc, argv, "-rate", .04);
+    float thresh = find_float_arg(argc, argv, "-thresh", 1.);
+    float rotate = find_float_arg(argc, argv, "-rotate", 0);
+    float momentum = find_float_arg(argc, argv, "-momentum", .9);
+    float lambda = find_float_arg(argc, argv, "-lambda", .01);
+    char *prefix = find_char_arg(argc, argv, "-prefix", 0);
+    int reconstruct = find_arg(argc, argv, "-reconstruct");
+    int smooth_size = find_int_arg(argc, argv, "-smooth", 1);
+
+    network net = parse_network_cfg(cfg);
+    load_weights(&net, weights);
+    char *cfgbase = basecfg(cfg);
+    char *imbase = basecfg(input);
+
+    set_batch_network(&net, 1);
+    image im = load_image_color(input, 0, 0);
+    if(0){
+        float scale = 1;
+        if(im.w > 512 || im.h > 512){
+            if(im.w > im.h) scale = 512.0/im.w;
+            else scale = 512.0/im.h;
+        }
+        image resized = resize_image(im, scale*im.w, scale*im.h);
+        free_image(im);
+        im = resized;
+    }
+
+    float *features = 0;
+    image update;
+    if (reconstruct){
+        resize_network(&net, im.w, im.h);
+
+        int zz = 0;
+        network_predict(net, im.data);
+        image out_im = get_network_image(net);
+        image crop = crop_image(out_im, zz, zz, out_im.w-2*zz, out_im.h-2*zz);
+        //flip_image(crop);
+        image f_im = resize_image(crop, out_im.w, out_im.h);
+        free_image(crop);
+        printf("%d features\n", out_im.w*out_im.h*out_im.c);
+
+
+        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;
+    int n;
+    for(e = 0; e < rounds; ++e){
+        fprintf(stderr, "Iteration: ");
+        fflush(stderr);
+        for(n = 0; n < iters; ++n){
+            fprintf(stderr, "%d, ", n);
+            fflush(stderr);
+            if(reconstruct){
+                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
+                wait_key_cv(10);
+#endif
+            }else{
+                int layer = max_layer + rand()%range - range/2;
+                int octave = rand()%octaves;
+                optimize_picture(&net, im, layer, 1/pow(1.33333333, octave), rate, thresh, norm);
+            }
+        }
+        fprintf(stderr, "done\n");
+        if(0){
+            image g = grayscale_image(im);
+            free_image(im);
+            im = g;
+        }
+        char buff[256];
+        if (prefix){
+            sprintf(buff, "%s/%s_%s_%d_%06d",prefix, imbase, cfgbase, max_layer, e);
+        }else{
+            sprintf(buff, "%s_%s_%d_%06d",imbase, cfgbase, max_layer, e);
+        }
+        printf("%d %s\n", e, buff);
+        save_image(im, buff);
+        //show_image(im, buff);
+        //wait_key_cv(0);
+
+        if(rotate){
+            image rot = rotate_image(im, rotate);
+            free_image(im);
+            im = rot;
+        }
+        image crop = crop_image(im, im.w * (1. - zoom)/2., im.h * (1.-zoom)/2., im.w*zoom, im.h*zoom);
+        image resized = resize_image(crop, im.w, im.h);
+        free_image(im);
+        free_image(crop);
+        im = resized;
+    }
+}

--
Gitblit v1.8.0