From 655f636a42d6e1d4518b712cfac6d973424de693 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Sun, 08 Mar 2015 18:25:28 +0000
Subject: [PATCH] detection layer fixed

---
 src/activations.h         |   12 ++++
 src/parser.c              |    9 ++
 src/data.c                |   11 +++
 src/captcha.c             |   64 +++++++++++++++++++++
 src/activation_kernels.cu |    1 
 src/activations.c         |   13 ----
 src/darknet.c             |   59 ++++++++++++++-----
 src/data.h                |    1 
 src/detection_layer.c     |    7 -
 9 files changed, 141 insertions(+), 36 deletions(-)

diff --git a/src/activation_kernels.cu b/src/activation_kernels.cu
index 7703d43..a15d64b 100644
--- a/src/activation_kernels.cu
+++ b/src/activation_kernels.cu
@@ -7,7 +7,6 @@
 __device__ float sigmoid_activate_kernel(float x){return 1./(1. + exp(-x));}
 __device__ float relu_activate_kernel(float x){return x*(x>0);}
 __device__ float ramp_activate_kernel(float x){return x*(x>0)+.1*x;}
-//__device__ float ramp_activate_kernel(float x){return 0;}
 __device__ float tanh_activate_kernel(float x){return (exp(2*x)-1)/(exp(2*x)+1);}
  
 __device__ float linear_gradient_kernel(float x){return 1;}
diff --git a/src/activations.c b/src/activations.c
index 48dce87..4689046 100644
--- a/src/activations.c
+++ b/src/activations.c
@@ -35,19 +35,6 @@
     return RELU;
 }
 
-float linear_activate(float x){return x;}
-float sigmoid_activate(float x){return 1./(1. + exp(-x));}
-float relu_activate(float x){return x*(x>0);}
-float ramp_activate(float x){return x*(x>0)+.1*x;}
-float tanh_activate(float x){return (exp(2*x)-1)/(exp(2*x)+1);}
-//float tanh_activate(float x){return x - (x*x*x)/3;}
-
-float linear_gradient(float x){return 1;}
-float sigmoid_gradient(float x){return (1-x)*x;}
-float relu_gradient(float x){return (x>0);}
-float ramp_gradient(float x){return (x>0)+.1;}
-float tanh_gradient(float x){return 1-x*x;}
-
 float activate(float x, ACTIVATION a)
 {
     switch(a){
diff --git a/src/activations.h b/src/activations.h
index d9cf662..337e5f1 100644
--- a/src/activations.h
+++ b/src/activations.h
@@ -18,5 +18,17 @@
 void gradient_array_ongpu(float *x, int n, ACTIVATION a, float *delta);
 #endif
 
+static inline float linear_activate(float x){return x;}
+static inline float sigmoid_activate(float x){return 1./(1. + exp(-x));}
+static inline float relu_activate(float x){return x*(x>0);}
+static inline float ramp_activate(float x){return x*(x>0)+.1*x;}
+static inline float tanh_activate(float x){return (exp(2*x)-1)/(exp(2*x)+1);}
+
+static inline float linear_gradient(float x){return 1;}
+static inline float sigmoid_gradient(float x){return (1-x)*x;}
+static inline float relu_gradient(float x){return (x>0);}
+static inline float ramp_gradient(float x){return (x>0)+.1;}
+static inline float tanh_gradient(float x){return 1-x*x;}
+
 #endif
 
diff --git a/src/captcha.c b/src/captcha.c
index c26db68..17b3f06 100644
--- a/src/captcha.c
+++ b/src/captcha.c
@@ -42,6 +42,68 @@
     }
 }
 
+void decode_captcha(char *cfgfile, char *weightfile)
+{
+    setbuf(stdout, NULL);
+    srand(time(0));
+    network net = parse_network_cfg(cfgfile);
+    set_batch_network(&net, 1);
+    if(weightfile){
+        load_weights(&net, weightfile);
+    }
+    char filename[256];
+    while(1){
+        printf("Enter filename: ");
+        fgets(filename, 256, stdin);
+        strtok(filename, "\n");
+        image im = load_image_color(filename, 60, 200);
+        scale_image(im, 1./255.);
+        float *X = im.data;
+        float *predictions = network_predict(net, X);
+        image out  = float_to_image(60, 200, 3, predictions);
+        show_image(out, "decoded");
+        cvWaitKey(0);
+        free_image(im);
+    }
+}
+
+void encode_captcha(char *cfgfile, char *weightfile)
+{
+    float avg_loss = -1;
+    srand(time(0));
+    char *base = basecfg(cfgfile);
+    printf("%s\n", base);
+    network net = parse_network_cfg(cfgfile);
+    if(weightfile){
+        load_weights(&net, weightfile);
+    }
+    printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay);
+    int imgs = 1024;
+    int i = net.seen/imgs;
+    list *plist = get_paths("/data/captcha/encode.list");
+    char **paths = (char **)list_to_array(plist);
+    printf("%d\n", plist->size);
+    clock_t time;
+    while(1){
+        ++i;
+        time=clock();
+        data train = load_data_captcha_encode(paths, imgs, plist->size, 60, 200);
+        scale_data_rows(train, 1./255);
+        printf("Loaded: %lf seconds\n", sec(clock()-time));
+        time=clock();
+        float loss = train_network(net, train);
+        net.seen += imgs;
+        if(avg_loss == -1) avg_loss = loss;
+        avg_loss = avg_loss*.9 + loss*.1;
+        printf("%d: %f, %f avg, %lf seconds, %d images\n", i, loss, avg_loss, sec(clock()-time), net.seen);
+        free_matrix(train.X);
+        if(i%100==0){
+            char buff[256];
+            sprintf(buff, "/home/pjreddie/imagenet_backup/%s_%d.weights",base, i);
+            save_weights(net, buff);
+        }
+    }
+}
 
 void validate_captcha(char *cfgfile, char *weightfile)
 {
@@ -115,6 +177,8 @@
     char *weights = (argc > 4) ? argv[4] : 0;
     if(0==strcmp(argv[2], "test")) test_captcha(cfg, weights);
     else if(0==strcmp(argv[2], "train")) train_captcha(cfg, weights);
+    else if(0==strcmp(argv[2], "encode")) encode_captcha(cfg, weights);
+    else if(0==strcmp(argv[2], "decode")) decode_captcha(cfg, weights);
     else if(0==strcmp(argv[2], "valid")) validate_captcha(cfg, weights);
 }
 
diff --git a/src/darknet.c b/src/darknet.c
index 3794f79..dbb30e0 100644
--- a/src/darknet.c
+++ b/src/darknet.c
@@ -13,15 +13,6 @@
 extern void run_detection(int argc, char **argv);
 extern void run_captcha(int argc, char **argv);
 
-void convert(char *cfgfile, char *outfile, char *weightfile)
-{
-    network net = parse_network_cfg(cfgfile);
-    if(weightfile){
-        load_weights(&net, weightfile);
-    }
-    save_network(net, outfile);
-}
-
 void del_arg(int argc, char **argv, int index)
 {
     int i;
@@ -57,20 +48,48 @@
     return def;
 }
 
-void scale_rate(char *filename, float scale)
+void change_rate(char *filename, float scale, float add)
 {
     // Ready for some weird shit??
     FILE *fp = fopen(filename, "r+b");
     if(!fp) file_error(filename);
     float rate = 0;
     fread(&rate, sizeof(float), 1, fp);
-    printf("Scaling learning rate from %f to %f\n", rate, rate*scale);
-    rate = rate*scale;
+    printf("Scaling learning rate from %f to %f\n", rate, rate*scale+add);
+    rate = rate*scale + add;
     fseek(fp, 0, SEEK_SET);
     fwrite(&rate, sizeof(float), 1, fp);
     fclose(fp);
 }
 
+void partial(char *cfgfile, char *weightfile, char *outfile, int max)
+{
+    network net = parse_network_cfg(cfgfile);
+    if(weightfile){
+        load_weights_upto(&net, weightfile, max);
+    }
+    save_weights(net, outfile);
+}
+
+void convert(char *cfgfile, char *outfile, char *weightfile)
+{
+    network net = parse_network_cfg(cfgfile);
+    if(weightfile){
+        load_weights(&net, weightfile);
+    }
+    save_network(net, outfile);
+}
+
+void visualize(char *cfgfile, char *weightfile)
+{
+    network net = parse_network_cfg(cfgfile);
+    if(weightfile){
+        load_weights(&net, weightfile);
+    }
+    visualize_network(net);
+    cvWaitKey(0);
+}
+
 int main(int argc, char **argv)
 {
     //test_convolutional_layer();
@@ -90,11 +109,21 @@
 #endif
 
     if(0==strcmp(argv[1], "imagenet")){
-        run_imagenet(argc, argv);   
+        run_imagenet(argc, argv);
     } else if (0 == strcmp(argv[1], "detection")){
-        run_detection(argc, argv);   
+        run_detection(argc, argv);
     } else if (0 == strcmp(argv[1], "captcha")){
-        run_captcha(argc, argv);   
+        run_captcha(argc, argv);
+    } else if (0 == strcmp(argv[1], "change")){
+        change_rate(argv[2], atof(argv[3]), (argc > 4) ? atof(argv[4]) : 0);
+    } else if (0 == strcmp(argv[1], "convert")){
+        convert(argv[2], argv[3], (argc > 4) ? argv[4] : 0);
+    } else if (0 == strcmp(argv[1], "partial")){
+        partial(argv[2], argv[3], argv[4], atoi(argv[5]));
+    } else if (0 == strcmp(argv[1], "visualize")){
+        visualize(argv[2], (argc > 3) ? argv[3] : 0);
+    } else {
+        fprintf(stderr, "Not an option: %s\n", argv[1]);
     }
     return 0;
 }
diff --git a/src/data.c b/src/data.c
index 46fba4b..a429476 100644
--- a/src/data.c
+++ b/src/data.c
@@ -90,6 +90,7 @@
         float dh = (y - j*box_height)/box_height;
         //printf("%d %d %d %f %f\n", id, i, j, dh, dw);
         int index = (i+j*num_width)*(4+classes);
+        if(truth[index+classes]) continue;
         truth[index+id] = 1;
         index += classes;
         truth[index++] = dh;
@@ -148,6 +149,16 @@
     return d;
 }
 
+data load_data_captcha_encode(char **paths, int n, int m, int h, int w)
+{
+    if(m) paths = get_random_paths(paths, n, m);
+    data d;
+    d.shallow = 0;
+    d.X = load_image_paths(paths, n, h, w);
+    d.y = d.X;
+    if(m) free(paths);
+    return d;
+}
 
 void fill_truth(char *path, char **labels, int k, float *truth)
 {
diff --git a/src/data.h b/src/data.h
index 6a08c88..0cae7f5 100644
--- a/src/data.h
+++ b/src/data.h
@@ -16,6 +16,7 @@
 
 void print_letters(float *pred, int n);
 data load_data_captcha(char **paths, int n, int m, int k, int h, int w);
+data load_data_captcha_encode(char **paths, int n, int m, int h, int w);
 data load_data(char **paths, int n, int m, char **labels, int k, int h, int w);
 pthread_t load_data_thread(char **paths, int n, int m, char **labels, int k, int h, int w, data *d);
 
diff --git a/src/detection_layer.c b/src/detection_layer.c
index bbc2e4f..d3cc1bd 100644
--- a/src/detection_layer.c
+++ b/src/detection_layer.c
@@ -53,13 +53,10 @@
             layer.output[out_i++] = scale*in[in_i++];
         }
         softmax_array(layer.output + out_i - layer.classes, layer.classes, layer.output + out_i - layer.classes);
-        activate_array(layer.output+out_i, layer.coords, SIGMOID);
+        activate_array(in+in_i, layer.coords, SIGMOID);
         for(j = 0; j < layer.coords; ++j){
             layer.output[out_i++] = mask*in[in_i++];
         }
-        //printf("%d\n", mask);
-        //for(j = 0; j < layer.classes+layer.coords; ++j) printf("%f ", layer.output[i*(layer.classes+layer.coords)+j]);
-        //printf ("\n");
     }
 }
 
@@ -78,10 +75,10 @@
             delta[in_i++] = scale*layer.delta[out_i++];
         }
         
+        gradient_array(layer.output + out_i, layer.coords, SIGMOID, layer.delta + out_i);
         for(j = 0; j < layer.coords; ++j){
             delta[in_i++] = layer.delta[out_i++];
         }
-        gradient_array(in + in_i - layer.coords, layer.coords, SIGMOID, layer.delta + out_i - layer.coords); 
         if(layer.rescore) delta[in_i-layer.coords-layer.classes-layer.rescore] = latent_delta;
     }
 }
diff --git a/src/parser.c b/src/parser.c
index 53e1f56..0ee73a1 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -775,7 +775,7 @@
     fclose(fp);
 }
 
-void load_weights(network *net, char *filename)
+void load_weights_upto(network *net, char *filename, int cutoff)
 {
     fprintf(stderr, "Loading weights from %s\n", filename);
     FILE *fp = fopen(filename, "r");
@@ -788,7 +788,7 @@
     set_learning_network(net, net->learning_rate, net->momentum, net->decay);
     
     int i;
-    for(i = 0; i < net->n; ++i){
+    for(i = 0; i < net->n && i < cutoff; ++i){
         if(net->types[i] == CONVOLUTIONAL){
             convolutional_layer layer = *(convolutional_layer *) net->layers[i];
             int num = layer.n*layer.c*layer.size*layer.size;
@@ -825,6 +825,11 @@
     fclose(fp);
 }
 
+void load_weights(network *net, char *filename)
+{
+    load_weights_upto(net, filename, net->n);
+}
+
 void save_network(network net, char *filename)
 {
     FILE *fp = fopen(filename, "w");

--
Gitblit v1.10.0