From 16d06ec0db241261d0d030722e440206ed8aad77 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Mon, 29 Feb 2016 21:54:12 +0000
Subject: [PATCH] stuff

---
 src/image.c |  178 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 156 insertions(+), 22 deletions(-)

diff --git a/src/image.c b/src/image.c
index 861d8a2..e2cf97f 100644
--- a/src/image.c
+++ b/src/image.c
@@ -1,13 +1,9 @@
 #include "image.h"
 #include "utils.h"
+#include "blas.h"
 #include <stdio.h>
 #include <math.h>
 
-#ifdef OPENCV
-#include "opencv2/highgui/highgui_c.h"
-#include "opencv2/imgproc/imgproc_c.h"
-#endif
-
 #define STB_IMAGE_IMPLEMENTATION
 #include "stb_image.h"
 #define STB_IMAGE_WRITE_IMPLEMENTATION
@@ -28,6 +24,26 @@
     return r;
 }
 
+void draw_label(image a, int r, int c, image label, const float *rgb)
+{
+    float ratio = (float) label.w / label.h;
+    int h = label.h;
+    int w = ratio * h;
+    image rl = resize_image(label, w, h);
+    if (r - h >= 0) r = r - h;
+
+    int i, j, k;
+    for(j = 0; j < h && j + r < a.h; ++j){
+        for(i = 0; i < w && i + c < a.w; ++i){
+            for(k = 0; k < label.c; ++k){
+                float val = get_pixel(rl, i, j, k);
+                set_pixel(a, i+c, j+r, k, rgb[k] * val);
+            }
+        }
+    }
+    free_image(rl);
+}
+
 void draw_box(image a, int x1, int y1, int x2, int y2, float r, float g, float b)
 {
     //normalize_image(a);
@@ -42,25 +58,25 @@
     if(y2 < 0) y2 = 0;
     if(y2 >= a.h) y2 = a.h-1;
 
-    for(i = x1; i < x2; ++i){
-        a.data[i + y1*a.w + 0*a.w*a.h] = b;
-        a.data[i + y2*a.w + 0*a.w*a.h] = b;
+    for(i = x1; i <= x2; ++i){
+        a.data[i + y1*a.w + 0*a.w*a.h] = r;
+        a.data[i + y2*a.w + 0*a.w*a.h] = r;
 
         a.data[i + y1*a.w + 1*a.w*a.h] = g;
         a.data[i + y2*a.w + 1*a.w*a.h] = g;
 
-        a.data[i + y1*a.w + 2*a.w*a.h] = r;
-        a.data[i + y2*a.w + 2*a.w*a.h] = r;
+        a.data[i + y1*a.w + 2*a.w*a.h] = b;
+        a.data[i + y2*a.w + 2*a.w*a.h] = b;
     }
-    for(i = y1; i < y2; ++i){
-        a.data[x1 + i*a.w + 0*a.w*a.h] = b;
-        a.data[x2 + i*a.w + 0*a.w*a.h] = b;
+    for(i = y1; i <= y2; ++i){
+        a.data[x1 + i*a.w + 0*a.w*a.h] = r;
+        a.data[x2 + i*a.w + 0*a.w*a.h] = r;
 
         a.data[x1 + i*a.w + 1*a.w*a.h] = g;
         a.data[x2 + i*a.w + 1*a.w*a.h] = g;
 
-        a.data[x1 + i*a.w + 2*a.w*a.h] = r;
-        a.data[x2 + i*a.w + 2*a.w*a.h] = r;
+        a.data[x1 + i*a.w + 2*a.w*a.h] = b;
+        a.data[x2 + i*a.w + 2*a.w*a.h] = b;
     }
 }
 
@@ -85,6 +101,43 @@
     }
 }
 
+void draw_detections(image im, int num, float thresh, box *boxes, float **probs, char **names, image *labels, int classes)
+{
+    int i;
+
+    for(i = 0; i < num; ++i){
+        int class = max_index(probs[i], classes);
+        float prob = probs[i][class];
+        if(prob > thresh){
+            int width = pow(prob, 1./2.)*10+1;
+            printf("%s: %.2f\n", names[class], prob);
+            int offset = class*17 % classes;
+            float red = get_color(0,offset,classes);
+            float green = get_color(1,offset,classes);
+            float blue = get_color(2,offset,classes);
+            float rgb[3];
+            rgb[0] = red;
+            rgb[1] = green;
+            rgb[2] = blue;
+            box b = boxes[i];
+
+            int left  = (b.x-b.w/2.)*im.w;
+            int right = (b.x+b.w/2.)*im.w;
+            int top   = (b.y-b.h/2.)*im.h;
+            int bot   = (b.y+b.h/2.)*im.h;
+
+            if(left < 0) left = 0;
+            if(right > im.w-1) right = im.w-1;
+            if(top < 0) top = 0;
+            if(bot > im.h-1) bot = im.h-1;
+
+            draw_box_width(im, left, top, right, bot, width, red, green, blue);
+            if (labels) draw_label(im, top + width, left, labels[class], rgb);
+        }
+    }
+}
+
+
 void flip_image(image a)
 {
     int i,j,k;
@@ -201,7 +254,7 @@
 }
 
 #ifdef OPENCV
-void show_image_cv(image p, char *name)
+void show_image_cv(image p, const char *name)
 {
     int x,y,k;
     image copy = copy_image(p);
@@ -215,7 +268,7 @@
 
     IplImage *disp = cvCreateImage(cvSize(p.w,p.h), IPL_DEPTH_8U, p.c);
     int step = disp->widthStep;
-    cvNamedWindow(buff, CV_WINDOW_AUTOSIZE); 
+    cvNamedWindow(buff, CV_WINDOW_NORMAL); 
     //cvMoveWindow(buff, 100*(windows%10) + 200*(windows/10), 100*(windows%10));
     ++windows;
     for(y = 0; y < p.h; ++y){
@@ -244,7 +297,7 @@
 }
 #endif
 
-void show_image(image p, char *name)
+void show_image(image p, const char *name)
 {
 #ifdef OPENCV
     show_image_cv(p, name);
@@ -254,7 +307,7 @@
 #endif
 }
 
-void save_image(image im, char *name)
+void save_image(image im, const char *name)
 {
     char buff[256];
     //sprintf(buff, "%s (%d)", name, windows);
@@ -272,6 +325,16 @@
 }
 
 #ifdef OPENCV
+image get_image_from_stream(CvCapture *cap)
+{
+    IplImage* src = cvQueryFrame(cap);
+    image im = ipl_to_image(src);
+    rgbgr_image(im);
+    return im;
+}
+#endif
+
+#ifdef OPENCV
 void save_image_jpg(image p, char *name)
 {
     image copy = copy_image(p);
@@ -332,6 +395,17 @@
     return out;
 }
 
+image make_random_image(int w, int h, int c)
+{
+    image out = make_empty_image(w,h,c);
+    out.data = calloc(h*w*c, sizeof(float));
+    int i;
+    for(i = 0; i < w*h*c; ++i){
+        out.data[i] = (rand_normal() * .25) + .5;
+    }
+    return out;
+}
+
 image float_to_image(int w, int h, int c, float *data)
 {
     image out = make_empty_image(w,h,c);
@@ -390,6 +464,39 @@
     return cropped;
 }
 
+image resize_min(image im, int min)
+{
+    int w = im.w;
+    int h = im.h;
+    if(w < h){
+        h = (h * min) / w;
+        w = min;
+    } else {
+        w = (w * min) / h;
+        h = min;
+    }
+    image resized = resize_image(im, w, h);
+    return resized;
+}
+
+image random_crop_image(image im, int low, int high, int size)
+{
+    int r = rand_int(low, high);
+    image resized = resize_min(im, r);
+    int dx = rand_int(0, resized.w - size);
+    int dy = rand_int(0, resized.h - size);
+    image crop = crop_image(resized, dx, dy, size, size);
+
+    /*
+       show_image(im, "orig");
+       show_image(crop, "cropped");
+       cvWaitKey(0);
+     */
+
+    free_image(resized);
+    return crop;
+}
+
 float three_way_max(float a, float b, float c)
 {
     return (a > b) ? ( (a > c) ? a : c) : ( (b > c) ? b : c) ;
@@ -634,9 +741,13 @@
     return resized;
 }
 
+#include "cuda.h"
+
 void test_resize(char *filename)
 {
     image im = load_image(filename, 0,0, 3);
+    float mag = mag_array(im.data, im.w*im.h*im.c);
+    printf("L2 Norm: %f\n", mag);
     image gray = grayscale_image(im);
 
     image sat2 = copy_image(im);
@@ -651,6 +762,25 @@
     image exp5 = copy_image(im);
     exposure_image(exp5, .5);
 
+#ifdef GPU
+    image r = resize_image(im, im.w, im.h);
+    image black = make_image(im.w*2 + 3, im.h*2 + 3, 9);
+    image black2 = make_image(im.w, im.h, 3);
+
+    float *r_gpu = cuda_make_array(r.data, r.w*r.h*r.c);
+    float *black_gpu = cuda_make_array(black.data, black.w*black.h*black.c);
+    float *black2_gpu = cuda_make_array(black2.data, black2.w*black2.h*black2.c);
+    shortcut_gpu(3, r.w, r.h, 1, r_gpu, black.w, black.h, 3, black_gpu);
+    //flip_image(r);
+    //shortcut_gpu(3, r.w, r.h, 1, r.data, black.w, black.h, 3, black.data);
+
+    shortcut_gpu(3, black.w, black.h, 3, black_gpu, black2.w, black2.h, 1, black2_gpu);
+    cuda_pull_array(black_gpu, black.data, black.w*black.h*black.c);
+    cuda_pull_array(black2_gpu, black2.data, black2.w*black2.h*black2.c);
+    show_image_layers(black, "Black");
+    show_image(black2, "Recreate");
+#endif
+
     show_image(im, "Original");
     show_image(gray, "Gray");
     show_image(sat2, "Saturation-2");
@@ -696,8 +826,12 @@
 
     if( (src = cvLoadImage(filename, flag)) == 0 )
     {
-        printf("Cannot load file image %s\n", filename);
-        exit(0);
+        fprintf(stderr, "Cannot load image \"%s\"\n", filename);
+        char buff[256];
+        sprintf(buff, "echo %s >> bad.list", filename);
+        system(buff);
+        return make_image(10,10,3);
+        //exit(0);
     }
     image out = ipl_to_image(src);
     cvReleaseImage(&src);
@@ -713,7 +847,7 @@
     int w, h, c;
     unsigned char *data = stbi_load(filename, &w, &h, &c, channels);
     if (!data) {
-        fprintf(stderr, "Cannot load file image %s\nSTB Reason: %s\n", filename, stbi_failure_reason());
+        fprintf(stderr, "Cannot load image \"%s\"\nSTB Reason: %s\n", filename, stbi_failure_reason());
         exit(0);
     }
     if(channels) c = channels;

--
Gitblit v1.10.0