From 913d355ec1cf34aad71fdd75202fc3b0309e63a0 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Thu, 28 Jan 2016 20:30:38 +0000
Subject: [PATCH] lots of stuff
---
src/nightmare.c | 131 ++++++++++++++++++++++++++++++++++++++++---
1 files changed, 122 insertions(+), 9 deletions(-)
diff --git a/src/nightmare.c b/src/nightmare.c
index 882c0eb..bc2060f 100644
--- a/src/nightmare.c
+++ b/src/nightmare.c
@@ -4,6 +4,10 @@
#include "blas.h"
#include "utils.h"
+#ifdef OPENCV
+#include "opencv2/highgui/highgui_c.h"
+#endif
+
float abs_mean(float *x, int n)
{
int i;
@@ -25,7 +29,7 @@
}
}
-void optimize_picture(network *net, image orig, int max_layer, float scale, float rate, float thresh)
+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);
@@ -49,7 +53,7 @@
#ifdef GPU
state.input = cuda_make_array(im.data, im.w*im.h*im.c);
- state.delta = cuda_make_array(0, 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);
@@ -85,7 +89,7 @@
//rate = rate / abs_mean(out.data, out.w*out.h*out.c);
- normalize_array(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);
/*
@@ -108,6 +112,73 @@
}
+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)
+{
+ scale_image(recon, 2);
+ translate_image(recon, -1);
+
+ 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);
+
+ 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);
+
+ constrain_image(recon);
+ free_image(delta);
+}
+
void run_nightmare(int argc, char **argv)
{
@@ -123,6 +194,7 @@
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);
@@ -130,6 +202,11 @@
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);
@@ -149,17 +226,49 @@
im = resized;
}
+ float *features;
+ 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*2, im.h);
+ f_im = resize_image(f_im, f_im.w*2, f_im.h);
+ features = f_im.data;
+
+ 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);
+ fprintf(stderr, "Iteration: ");
+ fflush(stderr);
for(n = 0; n < iters; ++n){
fprintf(stderr, "%d, ", n);
fflush(stderr);
- int layer = max_layer + rand()%range - range/2;
- int octave = rand()%octaves;
- optimize_picture(&net, im, layer, 1/pow(1.33333333, octave), rate, thresh);
+ if(reconstruct){
+ reconstruct_picture(net, features, im, update, rate, momentum, lambda, smooth_size);
+ show_image(im, "reconstruction");
+ #ifdef OPENCV
+ cvWaitKey(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){
@@ -168,7 +277,11 @@
im = g;
}
char buff[256];
- sprintf(buff, "%s_%s_%d_%06d",imbase, cfgbase, max_layer, e);
+ 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);
--
Gitblit v1.10.0