diff --git a/Makefile b/Makefile index 8898ba85..41f0e049 100644 --- a/Makefile +++ b/Makefile @@ -74,7 +74,7 @@ CFLAGS+= -DCUDNN -I/usr/local/cudnn/include LDFLAGS+= -L/usr/local/cudnn/lib64 -lcudnn endif -OBJ=http_stream.o gemm.o utils.o cuda.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o darknet.o detection_layer.o captcha.o route_layer.o writing.o box.o nightmare.o normalization_layer.o avgpool_layer.o coco.o dice.o yolo.o detector.o layer.o compare.o classifier.o local_layer.o swag.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o rnn.o rnn_vid.o crnn_layer.o demo.o tag.o cifar.o go.o batchnorm_layer.o art.o region_layer.o reorg_layer.o super.o voxel.o tree.o +OBJ=http_stream.o gemm.o utils.o cuda.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o darknet.o detection_layer.o captcha.o route_layer.o writing.o box.o nightmare.o normalization_layer.o avgpool_layer.o coco.o dice.o yolo.o detector.o layer.o compare.o classifier.o local_layer.o swag.o shortcut_layer.o activation_layer.o rnn_layer.o gru_layer.o rnn.o rnn_vid.o crnn_layer.o demo.o tag.o cifar.o go.o batchnorm_layer.o art.o region_layer.o reorg_layer.o reorg_old_layer.o super.o voxel.o tree.o ifeq ($(GPU), 1) LDFLAGS+= -lstdc++ OBJ+=convolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o network_kernels.o avgpool_layer_kernels.o diff --git a/build/darknet/darknet.vcxproj b/build/darknet/darknet.vcxproj index a6c2b518..300dd453 100644 --- a/build/darknet/darknet.vcxproj +++ b/build/darknet/darknet.vcxproj @@ -216,6 +216,7 @@ + @@ -269,6 +270,7 @@ + diff --git a/build/darknet/darknet_no_gpu.vcxproj b/build/darknet/darknet_no_gpu.vcxproj index 578a5af3..e1c4c37f 100644 --- a/build/darknet/darknet_no_gpu.vcxproj +++ b/build/darknet/darknet_no_gpu.vcxproj @@ -213,6 +213,7 @@ + @@ -266,6 +267,7 @@ + diff --git a/build/darknet/x64/darknet_voc.cmd b/build/darknet/x64/darknet_voc.cmd index 864bb641..1ee177a6 100644 --- a/build/darknet/x64/darknet_voc.cmd +++ b/build/darknet/x64/darknet_voc.cmd @@ -1,8 +1,8 @@ -darknet.exe detector test data/voc.data yolo-voc.cfg yolo-voc.weights 009460.jpg +rem darknet.exe detector test data/voc.data yolo-voc.cfg yolo-voc.weights 009460.jpg -darknet.exe detector test data/voc.data yolo-voc.cfg yolo-voc.weights -i 0 -thresh 0.1 dogr.jpg +darknet.exe detector test data/voc.data yolo-voc.cfg yolo-voc.weights -i 0 -thresh 0.2 dogr.jpg pause \ No newline at end of file diff --git a/build/darknet/x64/dogr.jpg b/build/darknet/x64/dogr.jpg new file mode 100644 index 00000000..e9201231 Binary files /dev/null and b/build/darknet/x64/dogr.jpg differ diff --git a/build/darknet/yolo_cpp_dll.vcxproj b/build/darknet/yolo_cpp_dll.vcxproj index 31699fba..b68c5b4c 100644 --- a/build/darknet/yolo_cpp_dll.vcxproj +++ b/build/darknet/yolo_cpp_dll.vcxproj @@ -218,6 +218,7 @@ + @@ -273,6 +274,7 @@ + diff --git a/build/darknet/yolo_cpp_dll_no_gpu.vcxproj b/build/darknet/yolo_cpp_dll_no_gpu.vcxproj index 03fbd3aa..c1d1d30e 100644 --- a/build/darknet/yolo_cpp_dll_no_gpu.vcxproj +++ b/build/darknet/yolo_cpp_dll_no_gpu.vcxproj @@ -202,6 +202,7 @@ + @@ -256,6 +257,7 @@ + diff --git a/src/blas.c b/src/blas.c index cb6501fd..6d565e96 100644 --- a/src/blas.c +++ b/src/blas.c @@ -6,22 +6,25 @@ #include #include #include -void reorg_cpu(float *x, int w, int h, int c, int batch, int stride, int forward, float *out) +void reorg_cpu(float *x, int out_w, int out_h, int out_c, int batch, int stride, int forward, float *out) { int b,i,j,k; - int out_c = c/(stride*stride); + int in_c = out_c/(stride*stride); + + //printf("\n out_c = %d, out_w = %d, out_h = %d, stride = %d, forward = %d \n", out_c, out_w, out_h, stride, forward); + //printf(" in_c = %d, in_w = %d, in_h = %d \n", in_c, out_w*stride, out_h*stride); for(b = 0; b < batch; ++b){ - for(k = 0; k < c; ++k){ - for(j = 0; j < h; ++j){ - for(i = 0; i < w; ++i){ - int in_index = i + w*(j + h*(k + c*b)); - int c2 = k % out_c; - int offset = k / out_c; + for(k = 0; k < out_c; ++k){ + for(j = 0; j < out_h; ++j){ + for(i = 0; i < out_w; ++i){ + int in_index = i + out_w*(j + out_h*(k + out_c*b)); + int c2 = k % in_c; + int offset = k / in_c; int w2 = i*stride + offset % stride; int h2 = j*stride + offset / stride; - int out_index = w2 + w*stride*(h2 + h*stride*(c2 + out_c*b)); - if(forward) out[out_index] = x[in_index]; + int out_index = w2 + out_w*stride*(h2 + out_h*stride*(c2 + in_c*b)); + if(forward) out[out_index] = x[in_index]; // used by default for forward (i.e. forward = 0) else out[in_index] = x[out_index]; } } diff --git a/src/layer.h b/src/layer.h index 93aca6c7..9bf60570 100644 --- a/src/layer.h +++ b/src/layer.h @@ -34,6 +34,7 @@ typedef enum { XNOR, REGION, REORG, + REORG_OLD, BLANK } LAYER_TYPE; diff --git a/src/parser.c b/src/parser.c index 78036322..1adcd166 100644 --- a/src/parser.c +++ b/src/parser.c @@ -24,6 +24,7 @@ #include "parser.h" #include "region_layer.h" #include "reorg_layer.h" +#include "reorg_old_layer.h" #include "rnn_layer.h" #include "route_layer.h" #include "shortcut_layer.h" @@ -60,6 +61,7 @@ LAYER_TYPE string_to_layer_type(char * type) if (strcmp(type, "[max]")==0 || strcmp(type, "[maxpool]")==0) return MAXPOOL; if (strcmp(type, "[reorg]")==0) return REORG; + if (strcmp(type, "[reorg_old]") == 0) return REORG_OLD; if (strcmp(type, "[avg]")==0 || strcmp(type, "[avgpool]")==0) return AVGPOOL; if (strcmp(type, "[dropout]")==0) return DROPOUT; @@ -358,6 +360,23 @@ layer parse_reorg(list *options, size_params params) return layer; } +layer parse_reorg_old(list *options, size_params params) +{ + printf("\n reorg_old \n"); + int stride = option_find_int(options, "stride", 1); + int reverse = option_find_int_quiet(options, "reverse", 0); + + int batch, h, w, c; + h = params.h; + w = params.w; + c = params.c; + batch = params.batch; + if (!(h && w && c)) error("Layer before reorg layer must output image."); + + layer layer = make_reorg_old_layer(batch, w, h, c, stride, reverse); + return layer; +} + maxpool_layer parse_maxpool(list *options, size_params params) { int stride = option_find_int(options, "stride",1); @@ -657,7 +676,9 @@ network parse_network_cfg_custom(char *filename, int batch) }else if(lt == MAXPOOL){ l = parse_maxpool(options, params); }else if(lt == REORG){ - l = parse_reorg(options, params); + l = parse_reorg(options, params); } + else if (lt == REORG_OLD) { + l = parse_reorg_old(options, params); }else if(lt == AVGPOOL){ l = parse_avgpool(options, params); }else if(lt == ROUTE){ diff --git a/src/reorg_layer.c b/src/reorg_layer.c index 2abca8fa..9c8ea829 100644 --- a/src/reorg_layer.c +++ b/src/reorg_layer.c @@ -77,38 +77,44 @@ void resize_reorg_layer(layer *l, int w, int h) void forward_reorg_layer(const layer l, network_state state) { - if(l.reverse){ - reorg_cpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output); - }else { - reorg_cpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output); - } + if (l.reverse) { + reorg_cpu(state.input, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 1, l.output); + } + else { + reorg_cpu(state.input, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 0, l.output); + } } void backward_reorg_layer(const layer l, network_state state) { - if(l.reverse){ - reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 0, state.delta); - }else{ - reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 1, state.delta); - } + if (l.reverse) { + reorg_cpu(l.delta, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 0, state.delta); + } + else { + reorg_cpu(l.delta, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 1, state.delta); + } } #ifdef GPU void forward_reorg_layer_gpu(layer l, network_state state) { - if(l.reverse){ - reorg_ongpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu); - }else { - reorg_ongpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output_gpu); - } + if (l.reverse) { + reorg_ongpu(state.input, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 1, l.output_gpu); + } + else { + reorg_ongpu(state.input, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 0, l.output_gpu); + } } void backward_reorg_layer_gpu(layer l, network_state state) { - if(l.reverse){ - reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, state.delta); - }else{ - reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, state.delta); - } + if (l.reverse) { + reorg_ongpu(l.delta_gpu, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 0, state.delta); + //reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, state.delta); + } + else { + reorg_ongpu(l.delta_gpu, l.out_w, l.out_h, l.out_c, l.batch, l.stride, 1, state.delta); + //reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, state.delta); + } } #endif diff --git a/src/reorg_old_layer.c b/src/reorg_old_layer.c new file mode 100644 index 00000000..c55cf7c2 --- /dev/null +++ b/src/reorg_old_layer.c @@ -0,0 +1,118 @@ +#include "reorg_old_layer.h" +#include "cuda.h" +#include "blas.h" +#include + + +layer make_reorg_old_layer(int batch, int w, int h, int c, int stride, int reverse) +{ + layer l = {0}; + l.type = REORG_OLD; + l.batch = batch; + l.stride = stride; + l.h = h; + l.w = w; + l.c = c; + if(reverse){ + l.out_w = w*stride; + l.out_h = h*stride; + l.out_c = c/(stride*stride); + }else{ + l.out_w = w/stride; + l.out_h = h/stride; + l.out_c = c*(stride*stride); + } + l.reverse = reverse; + fprintf(stderr, "reorg_old /%2d %4d x%4d x%4d -> %4d x%4d x%4d\n", stride, w, h, c, l.out_w, l.out_h, l.out_c); + l.outputs = l.out_h * l.out_w * l.out_c; + l.inputs = h*w*c; + int output_size = l.out_h * l.out_w * l.out_c * batch; + l.output = calloc(output_size, sizeof(float)); + l.delta = calloc(output_size, sizeof(float)); + + l.forward = forward_reorg_old_layer; + l.backward = backward_reorg_old_layer; +#ifdef GPU + l.forward_gpu = forward_reorg_old_layer_gpu; + l.backward_gpu = backward_reorg_old_layer_gpu; + + l.output_gpu = cuda_make_array(l.output, output_size); + l.delta_gpu = cuda_make_array(l.delta, output_size); +#endif + return l; +} + +void resize_reorg_old_layer(layer *l, int w, int h) +{ + int stride = l->stride; + int c = l->c; + + l->h = h; + l->w = w; + + if(l->reverse){ + l->out_w = w*stride; + l->out_h = h*stride; + l->out_c = c/(stride*stride); + }else{ + l->out_w = w/stride; + l->out_h = h/stride; + l->out_c = c*(stride*stride); + } + + l->outputs = l->out_h * l->out_w * l->out_c; + l->inputs = l->outputs; + int output_size = l->outputs * l->batch; + + l->output = realloc(l->output, output_size * sizeof(float)); + l->delta = realloc(l->delta, output_size * sizeof(float)); + +#ifdef GPU + cuda_free(l->output_gpu); + cuda_free(l->delta_gpu); + l->output_gpu = cuda_make_array(l->output, output_size); + l->delta_gpu = cuda_make_array(l->delta, output_size); +#endif +} + +void forward_reorg_old_layer(const layer l, network_state state) +{ + if (l.reverse) { + reorg_cpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output); + } + else { + reorg_cpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output); + } +} + +void backward_reorg_old_layer(const layer l, network_state state) +{ + if (l.reverse) { + reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 0, state.delta); + } + else { + reorg_cpu(l.delta, l.w, l.h, l.c, l.batch, l.stride, 1, state.delta); + } +} + +#ifdef GPU +void forward_reorg_old_layer_gpu(layer l, network_state state) +{ + if (l.reverse) { + reorg_ongpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 1, l.output_gpu); + } + else { + reorg_ongpu(state.input, l.w, l.h, l.c, l.batch, l.stride, 0, l.output_gpu); + } +} + +void backward_reorg_old_layer_gpu(layer l, network_state state) +{ + if (l.reverse) { + reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 0, state.delta); + } + else { + reorg_ongpu(l.delta_gpu, l.w, l.h, l.c, l.batch, l.stride, 1, state.delta); + } +} +#endif diff --git a/src/reorg_old_layer.h b/src/reorg_old_layer.h new file mode 100644 index 00000000..e1838202 --- /dev/null +++ b/src/reorg_old_layer.h @@ -0,0 +1,20 @@ +#ifndef REORG_OLD_LAYER_H +#define REORG_OLD_LAYER_H + +#include "image.h" +#include "cuda.h" +#include "layer.h" +#include "network.h" + +layer make_reorg_old_layer(int batch, int h, int w, int c, int stride, int reverse); +void resize_reorg_old_layer(layer *l, int w, int h); +void forward_reorg_old_layer(const layer l, network_state state); +void backward_reorg_old_layer(const layer l, network_state state); + +#ifdef GPU +void forward_reorg_old_layer_gpu(layer l, network_state state); +void backward_reorg_old_layer_gpu(layer l, network_state state); +#endif + +#endif +