From 8ed0a5538e04002c95ff0757791c52b4ec9a3e96 Mon Sep 17 00:00:00 2001
From: Joseph Redmon <pjreddie@gmail.com>
Date: Tue, 21 Jul 2015 18:38:36 +0000
Subject: [PATCH] faster resize?
---
src/image.c | 50 +++++++++++++++++++++++++
cfg/yolo.cfg | 2
Makefile | 4 +-
src/data.c | 21 +++++++++-
src/image.h | 2 +
5 files changed, 74 insertions(+), 5 deletions(-)
diff --git a/Makefile b/Makefile
index 32ff4c0..1b42277 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
-GPU=0
-OPENCV=0
+GPU=1
+OPENCV=1
DEBUG=0
ARCH= -arch=sm_52
diff --git a/cfg/yolo.cfg b/cfg/yolo.cfg
index eef0b69..ba44c4d 100644
--- a/cfg/yolo.cfg
+++ b/cfg/yolo.cfg
@@ -1,6 +1,6 @@
[net]
batch=64
-subdivisions=64
+subdivisions=2
height=448
width=448
channels=3
diff --git a/src/data.c b/src/data.c
index 982ef21..2b61853 100644
--- a/src/data.c
+++ b/src/data.c
@@ -425,10 +425,18 @@
d.X.vals = calloc(d.X.rows, sizeof(float*));
d.X.cols = h*w*3;
+ clock_t time;
+ clock_t load = 0;
+ clock_t resize = 0;
+ clock_t crop = 0;
+
int k = num_boxes*num_boxes*(4+classes+background);
d.y = make_matrix(n, k);
for(i = 0; i < n; ++i){
+ time=clock();
image orig = load_image_color(random_paths[i], 0, 0);
+ load += clock() - time;
+ time = clock();
int oh = orig.h;
int ow = orig.w;
@@ -456,17 +464,26 @@
int flip = rand_r(&data_seed)%2;
image cropped = crop_image(orig, pleft, ptop, swidth, sheight);
+
+ crop += clock() - time;
+ time = clock();
+
float dx = ((float)pleft/ow)/sx;
float dy = ((float)ptop /oh)/sy;
- free_image(orig);
image sized = resize_image(cropped, w, h);
- free_image(cropped);
if(flip) flip_image(sized);
d.X.vals[i] = sized.data;
+ resize += clock() - time;
+ time = clock();
+
fill_truth_detection(random_paths[i], d.y.vals[i], classes, num_boxes, flip, background, dx, dy, 1./sx, 1./sy);
+
+ free_image(orig);
+ free_image(cropped);
}
+ printf("load: %f, crop: %f, resize: %f\n", sec(load), sec(crop), sec(resize));
free(random_paths);
return d;
}
diff --git a/src/image.c b/src/image.c
index 046de0c..c499c79 100644
--- a/src/image.c
+++ b/src/image.c
@@ -584,6 +584,51 @@
return resized;
}
+image resize_image2(image im, int w, int h)
+{
+ image resized = make_image(w, h, im.c);
+ image part = make_image(w, im.h, im.c);
+ int r, c, k;
+ float w_scale = (float)(im.w - 1) / (w - 1);
+ float h_scale = (float)(im.h - 1) / (h - 1);
+ for(k = 0; k < im.c; ++k){
+ for(r = 0; r < im.h; ++r){
+ for(c = 0; c < w; ++c){
+ float val = 0;
+ if(c == w-1){
+ val = get_pixel(im, im.w-1, r, k);
+ } else {
+ float sx = c*w_scale;
+ int ix = (int) sx;
+ float dx = sx - ix;
+ val = (1 - dx) * get_pixel(im, ix, r, k) + dx * get_pixel(im, ix+1, r, k);
+ }
+ set_pixel(part, c, r, k, val);
+ }
+ }
+ }
+
+ for(k = 0; k < im.c; ++k){
+ for(r = 0; r < h; ++r){
+ float sy = r*h_scale;
+ int iy = (int) sy;
+ float dy = sy - iy;
+ for(c = 0; c < w; ++c){
+ float val = (1-dy) * get_pixel(part, c, iy, k);
+ set_pixel(resized, c, r, k, val);
+ }
+ if(r == h-1) continue;
+ for(c = 0; c < w; ++c){
+ float val = dy * get_pixel(part, c, iy+1, k);
+ add_pixel(resized, c, r, k, val);
+ }
+ }
+ }
+
+ free_image(part);
+ return resized;
+}
+
void test_resize(char *filename)
{
image im = load_image(filename, 0,0, 3);
@@ -728,6 +773,11 @@
assert(x < m.w && y < m.h && c < m.c);
m.data[c*m.h*m.w + y*m.w + x] = val;
}
+void add_pixel(image m, int x, int y, int c, float val)
+{
+ assert(x < m.w && y < m.h && c < m.c);
+ m.data[c*m.h*m.w + y*m.w + x] += val;
+}
void print_image(image m)
{
diff --git a/src/image.h b/src/image.h
index 578d690..1506077 100644
--- a/src/image.h
+++ b/src/image.h
@@ -28,6 +28,7 @@
void scale_image(image m, float s);
image crop_image(image im, int dx, int dy, int w, int h);
image resize_image(image im, int w, int h);
+image resize_image2(image im, int w, int h);
void translate_image(image m, float s);
void normalize_image(image p);
image rotate_image(image m, float rad);
@@ -62,6 +63,7 @@
float get_pixel(image m, int x, int y, int c);
float get_pixel_extend(image m, int x, int y, int c);
void set_pixel(image m, int x, int y, int c, float val);
+void add_pixel(image m, int x, int y, int c, float val);
float billinear_interpolate(image im, float x, float y, int c);
image get_image_layer(image m, int l);
--
Gitblit v1.10.0