opencv viz
This commit is contained in:
+9
-2
@@ -18,6 +18,13 @@ if(DEBUG)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(CUDA QUIET REQUIRED)
|
find_package(CUDA QUIET REQUIRED)
|
||||||
|
find_package(OpenCV QUIET)
|
||||||
|
if(${OpenCV_FOUND})
|
||||||
|
message("Compiling with openCV support")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DOPENCV")
|
||||||
|
else()
|
||||||
|
message(WARNING "OpenCV not found, compiling without it")
|
||||||
|
endif()
|
||||||
|
|
||||||
cuda_include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${CUDA_INCLUDE_DIRS})
|
cuda_include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${CUDA_INCLUDE_DIRS})
|
||||||
cuda_add_library(kernels SHARED src/kernels/activation_elu.cu
|
cuda_add_library(kernels SHARED src/kernels/activation_elu.cu
|
||||||
@@ -27,11 +34,11 @@ cuda_add_library(kernels SHARED src/kernels/activation_elu.cu
|
|||||||
src/kernels/softmax.cu)
|
src/kernels/softmax.cu)
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
|
||||||
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${CUDA_INCLUDE_DIRS})
|
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include ${CUDA_INCLUDE_DIRS} ${OPENCV_INCLUDE_DIRS})
|
||||||
add_library(tkDNN SHARED src/Layer.cpp src/LayerWgs.cpp
|
add_library(tkDNN SHARED src/Layer.cpp src/LayerWgs.cpp
|
||||||
src/Dense.cpp src/Activation.cpp src/Conv2d.cpp src/Flatten.cpp src/MulAdd.cpp src/Pooling.cpp src/Softmax.cpp
|
src/Dense.cpp src/Activation.cpp src/Conv2d.cpp src/Flatten.cpp src/MulAdd.cpp src/Pooling.cpp src/Softmax.cpp
|
||||||
src/Route.cpp src/Reorg.cpp src/Region.cpp src/Network.cpp src/utils.cpp src/NetworkRT.cpp)
|
src/Route.cpp src/Reorg.cpp src/Region.cpp src/Network.cpp src/utils.cpp src/NetworkRT.cpp)
|
||||||
target_link_libraries(tkDNN kernels ${CUDA_LIBRARIES} ${CUDA_CUBLAS_LIBRARIES} -lcudnn -lnvinfer)
|
target_link_libraries(tkDNN kernels ${CUDA_LIBRARIES} ${CUDA_CUBLAS_LIBRARIES} -lcudnn -lnvinfer ${OpenCV_LIBS})
|
||||||
|
|
||||||
add_executable(test_simple tests/simple/test_simple.cpp)
|
add_executable(test_simple tests/simple/test_simple.cpp)
|
||||||
target_link_libraries(test_simple tkDNN)
|
target_link_libraries(test_simple tkDNN)
|
||||||
|
|||||||
+25
-22
@@ -30,13 +30,13 @@ public:
|
|||||||
virtual ~Layer();
|
virtual ~Layer();
|
||||||
virtual layerType_t getLayerType() = 0;
|
virtual layerType_t getLayerType() = 0;
|
||||||
|
|
||||||
virtual value_type* infer(dataDim_t &dim, value_type* srcData) {
|
virtual dnnType* infer(dataDim_t &dim, dnnType* srcData) {
|
||||||
std::cout<<"No infer action for this layer\n";
|
std::cout<<"No infer action for this layer\n";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dataDim_t input_dim, output_dim;
|
dataDim_t input_dim, output_dim;
|
||||||
value_type *dstData; //where results will be putted
|
dnnType *dstData; //where results will be putted
|
||||||
|
|
||||||
std::string getLayerName() {
|
std::string getLayerName() {
|
||||||
layerType_t type = getLayerType();
|
layerType_t type = getLayerType();
|
||||||
@@ -75,14 +75,14 @@ public:
|
|||||||
int inputs, outputs;
|
int inputs, outputs;
|
||||||
std::string weights_path;
|
std::string weights_path;
|
||||||
|
|
||||||
value_type *data_h, *data_d;
|
dnnType *data_h, *data_d;
|
||||||
value_type *bias_h, *bias_d;
|
dnnType *bias_h, *bias_d;
|
||||||
|
|
||||||
//batchnorm
|
//batchnorm
|
||||||
bool batchnorm;
|
bool batchnorm;
|
||||||
value_type *scales_h, *scales_d;
|
dnnType *scales_h, *scales_d;
|
||||||
value_type *mean_h, *mean_d;
|
dnnType *mean_h, *mean_d;
|
||||||
value_type *variance_h, *variance_d;
|
dnnType *variance_h, *variance_d;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -96,7 +96,7 @@ public:
|
|||||||
virtual ~Dense();
|
virtual ~Dense();
|
||||||
virtual layerType_t getLayerType() { return LAYER_DENSE; };
|
virtual layerType_t getLayerType() { return LAYER_DENSE; };
|
||||||
|
|
||||||
virtual value_type* infer(dataDim_t &dim, value_type* srcData);
|
virtual dnnType* infer(dataDim_t &dim, dnnType* srcData);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ public:
|
|||||||
virtual ~Activation();
|
virtual ~Activation();
|
||||||
virtual layerType_t getLayerType() { return LAYER_ACTIVATION; };
|
virtual layerType_t getLayerType() { return LAYER_ACTIVATION; };
|
||||||
|
|
||||||
virtual value_type* infer(dataDim_t &dim, value_type* srcData);
|
virtual dnnType* infer(dataDim_t &dim, dnnType* srcData);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
cudnnActivationDescriptor_t activDesc;
|
cudnnActivationDescriptor_t activDesc;
|
||||||
@@ -139,7 +139,7 @@ public:
|
|||||||
virtual ~Conv2d();
|
virtual ~Conv2d();
|
||||||
virtual layerType_t getLayerType() { return LAYER_CONV2D; };
|
virtual layerType_t getLayerType() { return LAYER_CONV2D; };
|
||||||
|
|
||||||
virtual value_type* infer(dataDim_t &dim, value_type* srcData);
|
virtual dnnType* infer(dataDim_t &dim, dnnType* srcData);
|
||||||
|
|
||||||
int kernelH, kernelW, strideH, strideW, paddingH, paddingW;
|
int kernelH, kernelW, strideH, strideW, paddingH, paddingW;
|
||||||
|
|
||||||
@@ -165,7 +165,7 @@ public:
|
|||||||
virtual ~Flatten();
|
virtual ~Flatten();
|
||||||
virtual layerType_t getLayerType() { return LAYER_FLATTEN; };
|
virtual layerType_t getLayerType() { return LAYER_FLATTEN; };
|
||||||
|
|
||||||
virtual value_type* infer(dataDim_t &dim, value_type* srcData);
|
virtual dnnType* infer(dataDim_t &dim, dnnType* srcData);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -176,15 +176,15 @@ public:
|
|||||||
class MulAdd : public Layer {
|
class MulAdd : public Layer {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MulAdd(Network *net, value_type mul, value_type add);
|
MulAdd(Network *net, dnnType mul, dnnType add);
|
||||||
virtual ~MulAdd();
|
virtual ~MulAdd();
|
||||||
virtual layerType_t getLayerType() { return LAYER_MULADD; };
|
virtual layerType_t getLayerType() { return LAYER_MULADD; };
|
||||||
|
|
||||||
virtual value_type* infer(dataDim_t &dim, value_type* srcData);
|
virtual dnnType* infer(dataDim_t &dim, dnnType* srcData);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
value_type mul, add;
|
dnnType mul, add;
|
||||||
value_type *add_vector;
|
dnnType *add_vector;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -214,13 +214,13 @@ public:
|
|||||||
virtual ~Pooling();
|
virtual ~Pooling();
|
||||||
virtual layerType_t getLayerType() { return LAYER_POOLING; };
|
virtual layerType_t getLayerType() { return LAYER_POOLING; };
|
||||||
|
|
||||||
virtual value_type* infer(dataDim_t &dim, value_type* srcData);
|
virtual dnnType* infer(dataDim_t &dim, dnnType* srcData);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
cudnnPoolingDescriptor_t poolingDesc;
|
cudnnPoolingDescriptor_t poolingDesc;
|
||||||
tkdnnPoolingMode_t pool_mode;
|
tkdnnPoolingMode_t pool_mode;
|
||||||
value_type *tmpInputData, *tmpOutputData;
|
dnnType *tmpInputData, *tmpOutputData;
|
||||||
bool poolOn3d;
|
bool poolOn3d;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -234,7 +234,7 @@ public:
|
|||||||
virtual ~Softmax();
|
virtual ~Softmax();
|
||||||
virtual layerType_t getLayerType() { return LAYER_SOFTMAX; };
|
virtual layerType_t getLayerType() { return LAYER_SOFTMAX; };
|
||||||
|
|
||||||
virtual value_type* infer(dataDim_t &dim, value_type* srcData);
|
virtual dnnType* infer(dataDim_t &dim, dnnType* srcData);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -248,7 +248,7 @@ public:
|
|||||||
virtual ~Route();
|
virtual ~Route();
|
||||||
virtual layerType_t getLayerType() { return LAYER_ROUTE; };
|
virtual layerType_t getLayerType() { return LAYER_ROUTE; };
|
||||||
|
|
||||||
virtual value_type* infer(dataDim_t &dim, value_type* srcData);
|
virtual dnnType* infer(dataDim_t &dim, dnnType* srcData);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Layer **layers; //ids of layers to be merged
|
Layer **layers; //ids of layers to be merged
|
||||||
@@ -267,7 +267,7 @@ public:
|
|||||||
virtual ~Reorg();
|
virtual ~Reorg();
|
||||||
virtual layerType_t getLayerType() { return LAYER_REORG; };
|
virtual layerType_t getLayerType() { return LAYER_REORG; };
|
||||||
|
|
||||||
virtual value_type* infer(dataDim_t &dim, value_type* srcData);
|
virtual dnnType* infer(dataDim_t &dim, dnnType* srcData);
|
||||||
|
|
||||||
int stride;
|
int stride;
|
||||||
};
|
};
|
||||||
@@ -288,11 +288,13 @@ public:
|
|||||||
virtual ~Region();
|
virtual ~Region();
|
||||||
virtual layerType_t getLayerType() { return LAYER_REGION; };
|
virtual layerType_t getLayerType() { return LAYER_REGION; };
|
||||||
|
|
||||||
virtual value_type* infer(dataDim_t &dim, value_type* srcData);
|
virtual dnnType* infer(dataDim_t &dim, dnnType* srcData);
|
||||||
|
|
||||||
value_type *bias_h, *bias_d;
|
dnnType *bias_h, *bias_d;
|
||||||
int classes, coords, num;
|
int classes, coords, num;
|
||||||
float thresh;
|
float thresh;
|
||||||
|
box res_boxes[256];
|
||||||
|
int res_boxes_n;
|
||||||
|
|
||||||
int entry_index(int batch, int location, int entry);
|
int entry_index(int batch, int location, int entry);
|
||||||
box get_region_box(float *x, float *biases, int n, int index, int i, int j, int w, int h, int stride);
|
box get_region_box(float *x, float *biases, int n, int index, int i, int j, int w, int h, int stride);
|
||||||
@@ -301,6 +303,7 @@ public:
|
|||||||
int *map, float tree_thresh, int relative);
|
int *map, float tree_thresh, int relative);
|
||||||
void correct_region_boxes(box *boxes, int n, int w, int h, int netw, int neth, int relative);
|
void correct_region_boxes(box *boxes, int n, int w, int h, int netw, int neth, int relative);
|
||||||
void interpretData();
|
void interpretData();
|
||||||
|
void showImageResult(dnnType *input_h);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
Do inferece for every added layer
|
Do inferece for every added layer
|
||||||
*/
|
*/
|
||||||
value_type* infer(dataDim_t &dim, value_type* data);
|
dnnType* infer(dataDim_t &dim, dnnType* data);
|
||||||
|
|
||||||
bool addLayer(Layer *l);
|
bool addLayer(Layer *l);
|
||||||
void print();
|
void print();
|
||||||
|
|||||||
+2
-2
@@ -21,7 +21,7 @@ public:
|
|||||||
int buf_input_idx, buf_output_idx;
|
int buf_input_idx, buf_output_idx;
|
||||||
|
|
||||||
dataDim_t output_dim;
|
dataDim_t output_dim;
|
||||||
value_type *output;
|
dnnType *output;
|
||||||
cudaStream_t stream;
|
cudaStream_t stream;
|
||||||
|
|
||||||
NetworkRT(Network *net);
|
NetworkRT(Network *net);
|
||||||
@@ -30,7 +30,7 @@ public:
|
|||||||
/**
|
/**
|
||||||
Do inferece
|
Do inferece
|
||||||
*/
|
*/
|
||||||
value_type* infer(dataDim_t &dim, value_type* data);
|
dnnType* infer(dataDim_t &dim, dnnType* data);
|
||||||
|
|
||||||
nvinfer1::ITensor* convert_layer(nvinfer1::ITensor *input, Layer *l);
|
nvinfer1::ITensor* convert_layer(nvinfer1::ITensor *input, Layer *l);
|
||||||
nvinfer1::ITensor* convert_layer(nvinfer1::ITensor *input, Conv2d *l);
|
nvinfer1::ITensor* convert_layer(nvinfer1::ITensor *input, Conv2d *l);
|
||||||
|
|||||||
+4
-4
@@ -1,10 +1,10 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
void activationELUForward(value_type* srcData, value_type* dstData, int size);
|
void activationELUForward(dnnType* srcData, dnnType* dstData, int size);
|
||||||
void activationLEAKYForward(value_type* srcData, value_type* dstData, int size);
|
void activationLEAKYForward(dnnType* srcData, dnnType* dstData, int size);
|
||||||
void activationLOGISTICForward(value_type* srcData, value_type* dstData, int size);
|
void activationLOGISTICForward(dnnType* srcData, dnnType* dstData, int size);
|
||||||
|
|
||||||
void reorgForward( value_type* srcData, value_type* dstData,
|
void reorgForward( dnnType* srcData, dnnType* dstData,
|
||||||
int n, int c, int h, int w, int stride);
|
int n, int c, int h, int w, int stride);
|
||||||
void softmaxForward(float *input, int n, int batch, int batch_offset,
|
void softmaxForward(float *input, int n, int batch, int batch_offset,
|
||||||
int groups, int group_offset, int stride, float temp, float *output);
|
int groups, int group_offset, int stride, float temp, float *output);
|
||||||
|
|||||||
+8
-8
@@ -12,7 +12,7 @@
|
|||||||
#include <cublas_v2.h>
|
#include <cublas_v2.h>
|
||||||
#include <cudnn.h>
|
#include <cudnn.h>
|
||||||
|
|
||||||
#define value_type float
|
#define dnnType float
|
||||||
|
|
||||||
// Colored output
|
// Colored output
|
||||||
#define COL_END "\033[0m"
|
#define COL_END "\033[0m"
|
||||||
@@ -88,13 +88,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
void printCenteredTitle(const char *title, char fill, int dim);
|
void printCenteredTitle(const char *title, char fill, int dim);
|
||||||
void readBinaryFile(const char* fname, int size, value_type** data_h, value_type** data_d, int seek = 0);
|
void readBinaryFile(const char* fname, int size, dnnType** data_h, dnnType** data_d, int seek = 0);
|
||||||
int checkResult(int size, value_type *data_d, value_type *correct_d, bool device = true);
|
int checkResult(int size, dnnType *data_d, dnnType *correct_d, bool device = true);
|
||||||
void printDeviceVector(int size, value_type* vec_d, bool device = true);
|
void printDeviceVector(int size, dnnType* vec_d, bool device = true);
|
||||||
void resize(int size, value_type **data);
|
void resize(int size, dnnType **data);
|
||||||
|
|
||||||
void matrixTranspose(cublasHandle_t handle, value_type* srcData, value_type* dstData, int rows, int cols);
|
void matrixTranspose(cublasHandle_t handle, dnnType* srcData, dnnType* dstData, int rows, int cols);
|
||||||
|
|
||||||
void matrixMulAdd( cublasHandle_t handle, value_type* srcData, value_type* dstData,
|
void matrixMulAdd( cublasHandle_t handle, dnnType* srcData, dnnType* dstData,
|
||||||
value_type* add_vector, int dim, value_type mul);
|
dnnType* add_vector, int dim, dnnType mul);
|
||||||
#endif //UTILS_H
|
#endif //UTILS_H
|
||||||
|
|||||||
+4
-4
@@ -9,7 +9,7 @@ Activation::Activation(Network *net, int act_mode) :
|
|||||||
Layer(net) {
|
Layer(net) {
|
||||||
|
|
||||||
this->act_mode = act_mode;
|
this->act_mode = act_mode;
|
||||||
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(dnnType)) );
|
||||||
|
|
||||||
if(int(act_mode) < 100) {
|
if(int(act_mode) < 100) {
|
||||||
|
|
||||||
@@ -43,14 +43,14 @@ Activation::~Activation() {
|
|||||||
checkCUDNN( cudnnDestroyActivationDescriptor(activDesc) );
|
checkCUDNN( cudnnDestroyActivationDescriptor(activDesc) );
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* Activation::infer(dataDim_t &dim, value_type* srcData) {
|
dnnType* Activation::infer(dataDim_t &dim, dnnType* srcData) {
|
||||||
|
|
||||||
if(act_mode == ACTIVATION_LEAKY) {
|
if(act_mode == ACTIVATION_LEAKY) {
|
||||||
activationLEAKYForward(srcData, dstData, dim.tot());
|
activationLEAKYForward(srcData, dstData, dim.tot());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
value_type alpha = value_type(1);
|
dnnType alpha = dnnType(1);
|
||||||
value_type beta = value_type(0);
|
dnnType beta = dnnType(0);
|
||||||
checkCUDNN( cudnnActivationForward(net->cudnnHandle,
|
checkCUDNN( cudnnActivationForward(net->cudnnHandle,
|
||||||
activDesc,
|
activDesc,
|
||||||
&alpha,
|
&alpha,
|
||||||
|
|||||||
+6
-6
@@ -76,7 +76,7 @@ Conv2d::Conv2d( Network *net, int out_ch, int kernelH, int kernelW,
|
|||||||
output_dim.l = 1;
|
output_dim.l = 1;
|
||||||
|
|
||||||
//allocate data for infer result
|
//allocate data for infer result
|
||||||
checkCuda( cudaMalloc(&dstData, output_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&dstData, output_dim.tot()*sizeof(dnnType)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
Conv2d::~Conv2d() {
|
Conv2d::~Conv2d() {
|
||||||
@@ -91,12 +91,12 @@ Conv2d::~Conv2d() {
|
|||||||
checkCuda( cudaFree(dstData) );
|
checkCuda( cudaFree(dstData) );
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* Conv2d::infer(dataDim_t &dim, value_type* srcData) {
|
dnnType* Conv2d::infer(dataDim_t &dim, dnnType* srcData) {
|
||||||
|
|
||||||
|
|
||||||
// convolution
|
// convolution
|
||||||
value_type alpha = value_type(1);
|
dnnType alpha = dnnType(1);
|
||||||
value_type beta = value_type(0);
|
dnnType beta = dnnType(0);
|
||||||
checkCUDNN( cudnnConvolutionForward(net->cudnnHandle,
|
checkCUDNN( cudnnConvolutionForward(net->cudnnHandle,
|
||||||
&alpha, srcTensorDesc, srcData, filterDesc,
|
&alpha, srcTensorDesc, srcData, filterDesc,
|
||||||
data_d, convDesc, algo, workSpace, ws_sizeInBytes,
|
data_d, convDesc, algo, workSpace, ws_sizeInBytes,
|
||||||
@@ -104,8 +104,8 @@ value_type* Conv2d::infer(dataDim_t &dim, value_type* srcData) {
|
|||||||
|
|
||||||
if(!batchnorm) {
|
if(!batchnorm) {
|
||||||
// bias
|
// bias
|
||||||
alpha = value_type(1);
|
alpha = dnnType(1);
|
||||||
beta = value_type(1);
|
beta = dnnType(1);
|
||||||
checkCUDNN( cudnnAddTensor(net->cudnnHandle,
|
checkCUDNN( cudnnAddTensor(net->cudnnHandle,
|
||||||
&alpha, biasTensorDesc, bias_d,
|
&alpha, biasTensorDesc, bias_d,
|
||||||
&beta, dstTensorDesc, dstData) );
|
&beta, dstTensorDesc, dstData) );
|
||||||
|
|||||||
+4
-4
@@ -14,7 +14,7 @@ Dense::Dense(Network *net, int out_ch, const char* fname_weights) :
|
|||||||
output_dim.l = 1;
|
output_dim.l = 1;
|
||||||
|
|
||||||
//allocate data for infer result
|
//allocate data for infer result
|
||||||
checkCuda( cudaMalloc(&dstData, output_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&dstData, output_dim.tot()*sizeof(dnnType)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
Dense::~Dense() {
|
Dense::~Dense() {
|
||||||
@@ -22,7 +22,7 @@ Dense::~Dense() {
|
|||||||
checkCuda( cudaFree(dstData) );
|
checkCuda( cudaFree(dstData) );
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* Dense::infer(dataDim_t &dim, value_type* srcData) {
|
dnnType* Dense::infer(dataDim_t &dim, dnnType* srcData) {
|
||||||
|
|
||||||
if (dim.n != 1)
|
if (dim.n != 1)
|
||||||
FatalError("Not Implemented");
|
FatalError("Not Implemented");
|
||||||
@@ -33,9 +33,9 @@ value_type* Dense::infer(dataDim_t &dim, value_type* srcData) {
|
|||||||
if (dim_x != input_dim.tot())
|
if (dim_x != input_dim.tot())
|
||||||
FatalError("Input mismatch");
|
FatalError("Input mismatch");
|
||||||
|
|
||||||
value_type alpha = value_type(1), beta = value_type(1);
|
dnnType alpha = dnnType(1), beta = dnnType(1);
|
||||||
// place bias into dstData
|
// place bias into dstData
|
||||||
checkCuda( cudaMemcpy(dstData, bias_d, dim_y*sizeof(value_type), cudaMemcpyDeviceToDevice) );
|
checkCuda( cudaMemcpy(dstData, bias_d, dim_y*sizeof(dnnType), cudaMemcpyDeviceToDevice) );
|
||||||
|
|
||||||
//do matrix moltiplication
|
//do matrix moltiplication
|
||||||
checkERROR( cublasSgemv(net->cublasHandle, CUBLAS_OP_T,
|
checkERROR( cublasSgemv(net->cublasHandle, CUBLAS_OP_T,
|
||||||
|
|||||||
+2
-2
@@ -7,7 +7,7 @@ namespace tkDNN {
|
|||||||
|
|
||||||
Flatten::Flatten(Network *net) : Layer(net) {
|
Flatten::Flatten(Network *net) : Layer(net) {
|
||||||
|
|
||||||
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(dnnType)) );
|
||||||
|
|
||||||
output_dim.n = 1;
|
output_dim.n = 1;
|
||||||
output_dim.c = input_dim.tot();
|
output_dim.c = input_dim.tot();
|
||||||
@@ -22,7 +22,7 @@ Flatten::~Flatten() {
|
|||||||
checkCuda( cudaFree(dstData) );
|
checkCuda( cudaFree(dstData) );
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* Flatten::infer(dataDim_t &dim, value_type* srcData) {
|
dnnType* Flatten::infer(dataDim_t &dim, dnnType* srcData) {
|
||||||
|
|
||||||
//transpose per channel
|
//transpose per channel
|
||||||
matrixTranspose(net->cublasHandle, srcData, dstData, dim.c, dim.h*dim.w*dim.l);
|
matrixTranspose(net->cublasHandle, srcData, dstData, dim.c, dim.h*dim.w*dim.l);
|
||||||
|
|||||||
+6
-6
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
namespace tkDNN {
|
namespace tkDNN {
|
||||||
|
|
||||||
MulAdd::MulAdd(Network *net, value_type mul, value_type add) : Layer(net) {
|
MulAdd::MulAdd(Network *net, dnnType mul, dnnType add) : Layer(net) {
|
||||||
|
|
||||||
this->mul = mul;
|
this->mul = mul;
|
||||||
this->add = add;
|
this->add = add;
|
||||||
@@ -13,16 +13,16 @@ MulAdd::MulAdd(Network *net, value_type mul, value_type add) : Layer(net) {
|
|||||||
int size = input_dim.tot();
|
int size = input_dim.tot();
|
||||||
|
|
||||||
// create a vector with all value setted to add
|
// create a vector with all value setted to add
|
||||||
value_type *add_vector_h = new value_type[size];
|
dnnType *add_vector_h = new dnnType[size];
|
||||||
for(int i=0; i<size; i++)
|
for(int i=0; i<size; i++)
|
||||||
add_vector_h[i] = add;
|
add_vector_h[i] = add;
|
||||||
|
|
||||||
checkCuda( cudaMalloc(&add_vector, size*sizeof(value_type)));
|
checkCuda( cudaMalloc(&add_vector, size*sizeof(dnnType)));
|
||||||
checkCuda( cudaMemcpy(add_vector, add_vector_h, size*sizeof(value_type), cudaMemcpyHostToDevice));
|
checkCuda( cudaMemcpy(add_vector, add_vector_h, size*sizeof(dnnType), cudaMemcpyHostToDevice));
|
||||||
delete [] add_vector_h;
|
delete [] add_vector_h;
|
||||||
|
|
||||||
|
|
||||||
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(dnnType)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
MulAdd::~MulAdd() {
|
MulAdd::~MulAdd() {
|
||||||
@@ -31,7 +31,7 @@ MulAdd::~MulAdd() {
|
|||||||
checkCuda( cudaFree(dstData) );
|
checkCuda( cudaFree(dstData) );
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* MulAdd::infer(dataDim_t &dim, value_type* srcData) {
|
dnnType* MulAdd::infer(dataDim_t &dim, dnnType* srcData) {
|
||||||
|
|
||||||
matrixMulAdd(net->cublasHandle, srcData, dstData, add_vector, input_dim.tot(), mul);
|
matrixMulAdd(net->cublasHandle, srcData, dstData, add_vector, input_dim.tot(), mul);
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -30,7 +30,7 @@ Network::~Network() {
|
|||||||
checkERROR( cublasDestroy(cublasHandle) );
|
checkERROR( cublasDestroy(cublasHandle) );
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* Network::infer(dataDim_t &dim, value_type* data) {
|
dnnType* Network::infer(dataDim_t &dim, dnnType* data) {
|
||||||
|
|
||||||
//do infer for every layer
|
//do infer for every layer
|
||||||
for(int i=0; i<num_layers; i++) {
|
for(int i=0; i<num_layers; i++) {
|
||||||
|
|||||||
+5
-5
@@ -81,9 +81,9 @@ NetworkRT::NetworkRT(Network *net) {
|
|||||||
std::cout<<"input idex = "<<buf_input_idx<<" -> output index = "<<buf_output_idx<<"\n";
|
std::cout<<"input idex = "<<buf_input_idx<<" -> output index = "<<buf_output_idx<<"\n";
|
||||||
|
|
||||||
// create GPU buffers and a stream
|
// create GPU buffers and a stream
|
||||||
checkCuda(cudaMalloc(&buffersRT[buf_input_idx], dim.tot()*sizeof(value_type)));
|
checkCuda(cudaMalloc(&buffersRT[buf_input_idx], dim.tot()*sizeof(dnnType)));
|
||||||
checkCuda(cudaMalloc(&buffersRT[buf_output_idx], output_dim.tot()*sizeof(value_type)));
|
checkCuda(cudaMalloc(&buffersRT[buf_output_idx], output_dim.tot()*sizeof(dnnType)));
|
||||||
checkCuda(cudaMalloc(&output, output_dim.tot()*sizeof(value_type)));
|
checkCuda(cudaMalloc(&output, output_dim.tot()*sizeof(dnnType)));
|
||||||
checkCuda(cudaStreamCreate(&stream));
|
checkCuda(cudaStreamCreate(&stream));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ NetworkRT::~NetworkRT() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* NetworkRT::infer(dataDim_t &dim, value_type* data) {
|
dnnType* NetworkRT::infer(dataDim_t &dim, dnnType* data) {
|
||||||
|
|
||||||
checkCuda(cudaMemcpyAsync(buffersRT[buf_input_idx], data, dim.tot()*sizeof(float), cudaMemcpyDeviceToDevice, stream));
|
checkCuda(cudaMemcpyAsync(buffersRT[buf_input_idx], data, dim.tot()*sizeof(float), cudaMemcpyDeviceToDevice, stream));
|
||||||
contextRT->enqueue(1, buffersRT, stream, nullptr);
|
contextRT->enqueue(1, buffersRT, stream, nullptr);
|
||||||
@@ -161,7 +161,7 @@ ITensor* NetworkRT::convert_layer(ITensor *input, Conv2d *l) {
|
|||||||
float eps = CUDNN_BN_MIN_EPSILON;
|
float eps = CUDNN_BN_MIN_EPSILON;
|
||||||
|
|
||||||
//make power array of ones
|
//make power array of ones
|
||||||
value_type *power_h = new value_type[l->outputs];
|
dnnType *power_h = new dnnType[l->outputs];
|
||||||
for(int i=0; i<l->outputs; i++) power_h[i] = 1.0f;
|
for(int i=0; i<l->outputs; i++) power_h[i] = 1.0f;
|
||||||
|
|
||||||
//convert mean
|
//convert mean
|
||||||
|
|||||||
+8
-8
@@ -57,15 +57,15 @@ Pooling::Pooling( Network *net, int winH, int winW, int strideH, int strideW,
|
|||||||
output_dim.w = w;
|
output_dim.w = w;
|
||||||
output_dim.l = l;
|
output_dim.l = l;
|
||||||
|
|
||||||
checkCuda( cudaMalloc(&dstData, output_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&dstData, output_dim.tot()*sizeof(dnnType)) );
|
||||||
|
|
||||||
//pool on 3d data need transposition at the enter and on the exit
|
//pool on 3d data need transposition at the enter and on the exit
|
||||||
//allocate for initial and final transposition
|
//allocate for initial and final transposition
|
||||||
if(poolOn3d) {
|
if(poolOn3d) {
|
||||||
output_dim.n = 1;
|
output_dim.n = 1;
|
||||||
|
|
||||||
checkCuda( cudaMalloc(&tmpInputData, input_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&tmpInputData, input_dim.tot()*sizeof(dnnType)) );
|
||||||
checkCuda( cudaMalloc(&tmpOutputData, output_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&tmpOutputData, output_dim.tot()*sizeof(dnnType)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -81,10 +81,10 @@ Pooling::~Pooling() {
|
|||||||
checkCuda( cudaFree(dstData) );
|
checkCuda( cudaFree(dstData) );
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* Pooling::infer(dataDim_t &dim, value_type* srcData) {
|
dnnType* Pooling::infer(dataDim_t &dim, dnnType* srcData) {
|
||||||
|
|
||||||
value_type *poolSrc = srcData;
|
dnnType *poolSrc = srcData;
|
||||||
value_type *poolDst = dstData;
|
dnnType *poolDst = dstData;
|
||||||
|
|
||||||
if(poolOn3d) {
|
if(poolOn3d) {
|
||||||
matrixTranspose(net->cublasHandle, srcData, tmpInputData, dim.h*dim.w*dim.c, dim.l);
|
matrixTranspose(net->cublasHandle, srcData, tmpInputData, dim.h*dim.w*dim.c, dim.l);
|
||||||
@@ -92,8 +92,8 @@ value_type* Pooling::infer(dataDim_t &dim, value_type* srcData) {
|
|||||||
poolDst = tmpOutputData;
|
poolDst = tmpOutputData;
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type alpha = value_type(1);
|
dnnType alpha = dnnType(1);
|
||||||
value_type beta = value_type(0);
|
dnnType beta = dnnType(0);
|
||||||
checkCUDNN( cudnnPoolingForward(net->cudnnHandle, poolingDesc,
|
checkCUDNN( cudnnPoolingForward(net->cudnnHandle, poolingDesc,
|
||||||
&alpha, srcTensorDesc, poolSrc,
|
&alpha, srcTensorDesc, poolSrc,
|
||||||
&beta, dstTensorDesc, poolDst) );
|
&beta, dstTensorDesc, poolDst) );
|
||||||
|
|||||||
+55
-8
@@ -1,5 +1,10 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#ifdef OPENCV
|
||||||
|
#include <opencv2/core/core.hpp>
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "Layer.h"
|
#include "Layer.h"
|
||||||
#include "kernels.h"
|
#include "kernels.h"
|
||||||
|
|
||||||
@@ -12,6 +17,7 @@ Region::Region(Network *net, int classes, int coords, int num, float thresh, con
|
|||||||
this->coords = coords;
|
this->coords = coords;
|
||||||
this->num = num;
|
this->num = num;
|
||||||
this->thresh = thresh;
|
this->thresh = thresh;
|
||||||
|
this->res_boxes_n = 0;
|
||||||
|
|
||||||
// same
|
// same
|
||||||
output_dim.n = input_dim.n;
|
output_dim.n = input_dim.n;
|
||||||
@@ -23,7 +29,7 @@ Region::Region(Network *net, int classes, int coords, int num, float thresh, con
|
|||||||
//load anchors
|
//load anchors
|
||||||
readBinaryFile(fname_weights, 2*num, &bias_h, &bias_d);
|
readBinaryFile(fname_weights, 2*num, &bias_h, &bias_d);
|
||||||
|
|
||||||
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(dnnType)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
Region::~Region() {
|
Region::~Region() {
|
||||||
@@ -36,9 +42,9 @@ int Region::entry_index(int batch, int location, int entry) {
|
|||||||
return batch*output_dim.tot() + n*input_dim.w*input_dim.h*(coords+classes+1) + entry*input_dim.w*input_dim.h + loc;
|
return batch*output_dim.tot() + n*input_dim.w*input_dim.h*(coords+classes+1) + entry*input_dim.w*input_dim.h + loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* Region::infer(dataDim_t &dim, value_type* srcData) {
|
dnnType* Region::infer(dataDim_t &dim, dnnType* srcData) {
|
||||||
|
|
||||||
checkCuda( cudaMemcpy(dstData, srcData, dim.tot()*sizeof(value_type), cudaMemcpyDeviceToDevice));
|
checkCuda( cudaMemcpy(dstData, srcData, dim.tot()*sizeof(dnnType), cudaMemcpyDeviceToDevice));
|
||||||
|
|
||||||
for (int b = 0; b < dim.n; ++b){
|
for (int b = 0; b < dim.n; ++b){
|
||||||
for(int n = 0; n < num; ++n){
|
for(int n = 0; n < num; ++n){
|
||||||
@@ -192,11 +198,11 @@ int max_index(float *a, int n) {
|
|||||||
|
|
||||||
void Region::interpretData() {
|
void Region::interpretData() {
|
||||||
|
|
||||||
int imW = 768, imH = 576;
|
int imW = net->input_dim.w, imH = net->input_dim.h;
|
||||||
|
|
||||||
int tot = output_dim.w*output_dim.h*num;
|
int tot = output_dim.w*output_dim.h*num;
|
||||||
float *lel = new value_type[output_dim.tot()];
|
float *lel = new dnnType[output_dim.tot()];
|
||||||
cudaMemcpy(lel, dstData, output_dim.tot()*sizeof(value_type), cudaMemcpyDeviceToHost);
|
cudaMemcpy(lel, dstData, output_dim.tot()*sizeof(dnnType), cudaMemcpyDeviceToHost);
|
||||||
box *boxes = (box*) calloc(tot, sizeof(box));
|
box *boxes = (box*) calloc(tot, sizeof(box));
|
||||||
float **probs = (float**) calloc(tot, sizeof(float *));
|
float **probs = (float**) calloc(tot, sizeof(float *));
|
||||||
for(int j = 0; j < tot; ++j) probs[j] = (float*)calloc(classes + 1, sizeof(float *));
|
for(int j = 0; j < tot; ++j) probs[j] = (float*)calloc(classes + 1, sizeof(float *));
|
||||||
@@ -232,10 +238,51 @@ void Region::interpretData() {
|
|||||||
int cl = max_index(probs[i], classes);
|
int cl = max_index(probs[i], classes);
|
||||||
float prob = probs[i][cl];
|
float prob = probs[i][cl];
|
||||||
if(prob > thresh) {
|
if(prob > thresh) {
|
||||||
//printf("%d %s: %.0f%%\n", i, names[class], prob*100);
|
box b = boxes[i];
|
||||||
printf("%d: %.0f%%\n", cl, prob*100);
|
int x = (b.x-b.w/2.)*imW;
|
||||||
|
int w = (b.x+b.w/2.)*imW - b.x;
|
||||||
|
int y = (b.y-b.h/2.)*imH;
|
||||||
|
int h = (b.y+b.h/2.)*imH - b.y;
|
||||||
|
|
||||||
|
printf("%d: %.0f%% box(x1, y1, x2, y2): %d %d %d %d\n", cl, prob*100, x, y, w, h);
|
||||||
|
b.x = x;
|
||||||
|
b.y = y;
|
||||||
|
b.h = h;
|
||||||
|
b.w = w;
|
||||||
|
res_boxes[res_boxes_n] = b;
|
||||||
|
res_boxes_n++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Region::showImageResult(dnnType *input_h) {
|
||||||
|
|
||||||
|
#ifdef OPENCV
|
||||||
|
dataDim_t dim = net->input_dim;
|
||||||
|
// read an image
|
||||||
|
cv::Mat r(dim.h, dim.w, CV_32F, input_h);
|
||||||
|
cv::Mat g(dim.h, dim.w, CV_32F, input_h + dim.h*dim.w);
|
||||||
|
cv::Mat b(dim.h, dim.w, CV_32F, input_h + dim.h*dim.w*2);
|
||||||
|
std::vector<cv::Mat> array_to_merge;
|
||||||
|
array_to_merge.push_back(b);
|
||||||
|
array_to_merge.push_back(g);
|
||||||
|
array_to_merge.push_back(r);
|
||||||
|
cv::Mat color;
|
||||||
|
cv::merge(array_to_merge, color);
|
||||||
|
|
||||||
|
for(int i=0; i<res_boxes_n; i++) {
|
||||||
|
box bx = res_boxes[i];
|
||||||
|
cv::rectangle(color, cv::Point(bx.x, bx.y), cv::Point(bx.w, bx.h),
|
||||||
|
cv::Scalar( 0, 0, 255), 2);
|
||||||
|
}
|
||||||
|
cv::namedWindow("result");
|
||||||
|
// show the image on window
|
||||||
|
cv::imshow("result", color);
|
||||||
|
// wait key for 5000 ms
|
||||||
|
cv::waitKey(5000);
|
||||||
|
#else
|
||||||
|
std::cout<<"Visualization not supported, please recompile with OpenCV\n";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -15,7 +15,7 @@ Reorg::Reorg(Network *net, int stride) : Layer(net) {
|
|||||||
output_dim.w = input_dim.w/stride;
|
output_dim.w = input_dim.w/stride;
|
||||||
output_dim.l = input_dim.l;
|
output_dim.l = input_dim.l;
|
||||||
|
|
||||||
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(dnnType)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
Reorg::~Reorg() {
|
Reorg::~Reorg() {
|
||||||
@@ -23,7 +23,7 @@ Reorg::~Reorg() {
|
|||||||
checkCuda( cudaFree(dstData) );
|
checkCuda( cudaFree(dstData) );
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* Reorg::infer(dataDim_t &dim, value_type* srcData) {
|
dnnType* Reorg::infer(dataDim_t &dim, dnnType* srcData) {
|
||||||
|
|
||||||
reorgForward(srcData, dstData, dim.n, dim.c, dim.h, dim.w, stride);
|
reorgForward(srcData, dstData, dim.n, dim.c, dim.h, dim.w, stride);
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -28,7 +28,7 @@ Route::Route(Network *net, Layer **layers, int layers_n) : Layer(net) {
|
|||||||
|
|
||||||
input_dim = output_dim;
|
input_dim = output_dim;
|
||||||
|
|
||||||
checkCuda( cudaMalloc(&dstData, output_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&dstData, output_dim.tot()*sizeof(dnnType)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
Route::~Route() {
|
Route::~Route() {
|
||||||
@@ -36,14 +36,14 @@ Route::~Route() {
|
|||||||
checkCuda( cudaFree(dstData) );
|
checkCuda( cudaFree(dstData) );
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* Route::infer(dataDim_t &dim, value_type* srcData) {
|
dnnType* Route::infer(dataDim_t &dim, dnnType* srcData) {
|
||||||
|
|
||||||
|
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
for(int i=0; i<layers_n; i++) {
|
for(int i=0; i<layers_n; i++) {
|
||||||
value_type *input = layers[i]->dstData;
|
dnnType *input = layers[i]->dstData;
|
||||||
int in_dim = layers[i]->input_dim.tot();
|
int in_dim = layers[i]->input_dim.tot();
|
||||||
checkCuda( cudaMemcpy(dstData + offset, input, in_dim*sizeof(value_type), cudaMemcpyDeviceToDevice));
|
checkCuda( cudaMemcpy(dstData + offset, input, in_dim*sizeof(dnnType), cudaMemcpyDeviceToDevice));
|
||||||
offset += in_dim;
|
offset += in_dim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -7,7 +7,7 @@ namespace tkDNN {
|
|||||||
|
|
||||||
Softmax::Softmax(Network *net) : Layer(net) {
|
Softmax::Softmax(Network *net) : Layer(net) {
|
||||||
|
|
||||||
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(value_type)) );
|
checkCuda( cudaMalloc(&dstData, input_dim.tot()*sizeof(dnnType)) );
|
||||||
|
|
||||||
checkCUDNN( cudnnSetTensor4dDescriptor(srcTensorDesc,
|
checkCUDNN( cudnnSetTensor4dDescriptor(srcTensorDesc,
|
||||||
net->tensorFormat,
|
net->tensorFormat,
|
||||||
@@ -28,10 +28,10 @@ Softmax::~Softmax() {
|
|||||||
checkCuda( cudaFree(dstData) );
|
checkCuda( cudaFree(dstData) );
|
||||||
}
|
}
|
||||||
|
|
||||||
value_type* Softmax::infer(dataDim_t &dim, value_type* srcData) {
|
dnnType* Softmax::infer(dataDim_t &dim, dnnType* srcData) {
|
||||||
|
|
||||||
value_type alpha = value_type(1);
|
dnnType alpha = dnnType(1);
|
||||||
value_type beta = value_type(0);
|
dnnType beta = dnnType(0);
|
||||||
checkCUDNN( cudnnSoftmaxForward(net->cudnnHandle,
|
checkCUDNN( cudnnSoftmaxForward(net->cudnnHandle,
|
||||||
CUDNN_SOFTMAX_ACCURATE ,
|
CUDNN_SOFTMAX_ACCURATE ,
|
||||||
CUDNN_SOFTMAX_MODE_CHANNEL,
|
CUDNN_SOFTMAX_MODE_CHANNEL,
|
||||||
|
|||||||
@@ -7,12 +7,12 @@
|
|||||||
x > 0 : y = x
|
x > 0 : y = x
|
||||||
*/
|
*/
|
||||||
__global__
|
__global__
|
||||||
void activation_elu(value_type *input, value_type *output, int size) {
|
void activation_elu(dnnType *input, dnnType *output, int size) {
|
||||||
|
|
||||||
int i = blockDim.x*blockIdx.x + threadIdx.x;
|
int i = blockDim.x*blockIdx.x + threadIdx.x;
|
||||||
|
|
||||||
if(i<size) {
|
if(i<size) {
|
||||||
value_type k0, k1;
|
dnnType k0, k1;
|
||||||
|
|
||||||
if (input[i]>0)
|
if (input[i]>0)
|
||||||
k0 = 1.0f;
|
k0 = 1.0f;
|
||||||
@@ -28,7 +28,7 @@ void activation_elu(value_type *input, value_type *output, int size) {
|
|||||||
/**
|
/**
|
||||||
ELU activation function
|
ELU activation function
|
||||||
*/
|
*/
|
||||||
void activationELUForward(value_type* srcData, value_type* dstData, int size)
|
void activationELUForward(dnnType* srcData, dnnType* dstData, int size)
|
||||||
{
|
{
|
||||||
int blocks = (size+255)/256;
|
int blocks = (size+255)/256;
|
||||||
int threads = 256;
|
int threads = 256;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include "kernels.h"
|
#include "kernels.h"
|
||||||
|
|
||||||
__global__
|
__global__
|
||||||
void activation_leaky(value_type *input, value_type *output, int size) {
|
void activation_leaky(dnnType *input, dnnType *output, int size) {
|
||||||
|
|
||||||
int i = blockDim.x*blockIdx.x + threadIdx.x;
|
int i = blockDim.x*blockIdx.x + threadIdx.x;
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ void activation_leaky(value_type *input, value_type *output, int size) {
|
|||||||
/**
|
/**
|
||||||
ELU activation function
|
ELU activation function
|
||||||
*/
|
*/
|
||||||
void activationLEAKYForward(value_type* srcData, value_type* dstData, int size)
|
void activationLEAKYForward(dnnType* srcData, dnnType* dstData, int size)
|
||||||
{
|
{
|
||||||
int blocks = (size+255)/256;
|
int blocks = (size+255)/256;
|
||||||
int threads = 256;
|
int threads = 256;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#include "kernels.h"
|
#include "kernels.h"
|
||||||
|
|
||||||
__global__
|
__global__
|
||||||
void activation_logistic(value_type *input, value_type *output, int size) {
|
void activation_logistic(dnnType *input, dnnType *output, int size) {
|
||||||
|
|
||||||
int i = blockDim.x*blockIdx.x + threadIdx.x;
|
int i = blockDim.x*blockIdx.x + threadIdx.x;
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@ void activation_logistic(value_type *input, value_type *output, int size) {
|
|||||||
/**
|
/**
|
||||||
LOGISTIC activation function
|
LOGISTIC activation function
|
||||||
*/
|
*/
|
||||||
void activationLOGISTICForward(value_type* srcData, value_type* dstData, int size)
|
void activationLOGISTICForward(dnnType* srcData, dnnType* dstData, int size)
|
||||||
{
|
{
|
||||||
int blocks = (size+255)/256;
|
int blocks = (size+255)/256;
|
||||||
int threads = 256;
|
int threads = 256;
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ __global__ void reorg_kernel(int N, float *x, int w, int h, int c, int batch, in
|
|||||||
/**
|
/**
|
||||||
reorg function function
|
reorg function function
|
||||||
*/
|
*/
|
||||||
void reorgForward(value_type* srcData, value_type* dstData,
|
void reorgForward(dnnType* srcData, dnnType* dstData,
|
||||||
int n, int c, int h, int w, int stride) {
|
int n, int c, int h, int w, int stride) {
|
||||||
|
|
||||||
int size = n*c*h*w;
|
int size = n*c*h*w;
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ public:
|
|||||||
|
|
||||||
virtual int enqueue(int batchSize, const void*const * inputs, void** outputs, void* workspace, cudaStream_t stream) override {
|
virtual int enqueue(int batchSize, const void*const * inputs, void** outputs, void* workspace, cudaStream_t stream) override {
|
||||||
|
|
||||||
activationLEAKYForward((value_type*)reinterpret_cast<const value_type*>(inputs[0]),
|
activationLEAKYForward((dnnType*)reinterpret_cast<const dnnType*>(inputs[0]),
|
||||||
reinterpret_cast<value_type*>(outputs[0]), size);
|
reinterpret_cast<dnnType*>(outputs[0]), size);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,10 +44,10 @@ public:
|
|||||||
|
|
||||||
virtual int enqueue(int batchSize, const void*const * inputs, void** outputs, void* workspace, cudaStream_t stream) override {
|
virtual int enqueue(int batchSize, const void*const * inputs, void** outputs, void* workspace, cudaStream_t stream) override {
|
||||||
|
|
||||||
value_type *srcData = (value_type*)reinterpret_cast<const value_type*>(inputs[0]);
|
dnnType *srcData = (dnnType*)reinterpret_cast<const dnnType*>(inputs[0]);
|
||||||
value_type *dstData = reinterpret_cast<value_type*>(outputs[0]);
|
dnnType *dstData = reinterpret_cast<dnnType*>(outputs[0]);
|
||||||
|
|
||||||
checkCuda( cudaMemcpy(dstData, srcData, batchSize*c*h*w*sizeof(value_type), cudaMemcpyDeviceToDevice));
|
checkCuda( cudaMemcpy(dstData, srcData, batchSize*c*h*w*sizeof(dnnType), cudaMemcpyDeviceToDevice));
|
||||||
|
|
||||||
for (int b = 0; b < batchSize; ++b){
|
for (int b = 0; b < batchSize; ++b){
|
||||||
for(int n = 0; n < num; ++n){
|
for(int n = 0; n < num; ++n){
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ public:
|
|||||||
|
|
||||||
virtual int enqueue(int batchSize, const void*const * inputs, void** outputs, void* workspace, cudaStream_t stream) override {
|
virtual int enqueue(int batchSize, const void*const * inputs, void** outputs, void* workspace, cudaStream_t stream) override {
|
||||||
|
|
||||||
reorgForward((value_type*)reinterpret_cast<const value_type*>(inputs[0]),
|
reorgForward((dnnType*)reinterpret_cast<const dnnType*>(inputs[0]),
|
||||||
reinterpret_cast<value_type*>(outputs[0]),
|
reinterpret_cast<dnnType*>(outputs[0]),
|
||||||
batchSize, c, h, w, stride);
|
batchSize, c, h, w, stride);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+23
-23
@@ -14,7 +14,7 @@ void printCenteredTitle(const char *title, char fill, int dim) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void readBinaryFile(const char* fname, int size, value_type** data_h, value_type** data_d, int seek)
|
void readBinaryFile(const char* fname, int size, dnnType** data_h, dnnType** data_d, int seek)
|
||||||
{
|
{
|
||||||
std::ifstream dataFile (fname, std::ios::in | std::ios::binary);
|
std::ifstream dataFile (fname, std::ios::in | std::ios::binary);
|
||||||
std::stringstream error_s;
|
std::stringstream error_s;
|
||||||
@@ -25,11 +25,11 @@ void readBinaryFile(const char* fname, int size, value_type** data_h, value_type
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(seek != 0) {
|
if(seek != 0) {
|
||||||
dataFile.seekg(seek*sizeof(value_type), dataFile.cur);
|
dataFile.seekg(seek*sizeof(dnnType), dataFile.cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
int size_b = size*sizeof(value_type);
|
int size_b = size*sizeof(dnnType);
|
||||||
*data_h = new value_type[size];
|
*data_h = new dnnType[size];
|
||||||
if (!dataFile.read ((char*) *data_h, size_b))
|
if (!dataFile.read ((char*) *data_h, size_b))
|
||||||
{
|
{
|
||||||
error_s << "Error reading file " << fname;
|
error_s << "Error reading file " << fname;
|
||||||
@@ -40,13 +40,13 @@ void readBinaryFile(const char* fname, int size, value_type** data_h, value_type
|
|||||||
checkCuda( cudaMemcpy(*data_d, *data_h, size_b, cudaMemcpyHostToDevice) );
|
checkCuda( cudaMemcpy(*data_d, *data_h, size_b, cudaMemcpyHostToDevice) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void printDeviceVector(int size, value_type* vec_d, bool device)
|
void printDeviceVector(int size, dnnType* vec_d, bool device)
|
||||||
{
|
{
|
||||||
value_type *vec;
|
dnnType *vec;
|
||||||
if(device) {
|
if(device) {
|
||||||
vec = new value_type[size];
|
vec = new dnnType[size];
|
||||||
cudaDeviceSynchronize();
|
cudaDeviceSynchronize();
|
||||||
cudaMemcpy(vec, vec_d, size*sizeof(value_type), cudaMemcpyDeviceToHost);
|
cudaMemcpy(vec, vec_d, size*sizeof(dnnType), cudaMemcpyDeviceToHost);
|
||||||
} else {
|
} else {
|
||||||
vec = vec_d;
|
vec = vec_d;
|
||||||
}
|
}
|
||||||
@@ -60,17 +60,17 @@ void printDeviceVector(int size, value_type* vec_d, bool device)
|
|||||||
delete [] vec;
|
delete [] vec;
|
||||||
}
|
}
|
||||||
|
|
||||||
int checkResult(int size, value_type *data_d, value_type *correct_d, bool device) {
|
int checkResult(int size, dnnType *data_d, dnnType *correct_d, bool device) {
|
||||||
|
|
||||||
value_type *data_h, *correct_h;
|
dnnType *data_h, *correct_h;
|
||||||
const float eps = 0.0001f;
|
const float eps = 0.0001f;
|
||||||
|
|
||||||
if(device) {
|
if(device) {
|
||||||
data_h = new value_type[size];
|
data_h = new dnnType[size];
|
||||||
correct_h = new value_type[size];
|
correct_h = new dnnType[size];
|
||||||
cudaDeviceSynchronize();
|
cudaDeviceSynchronize();
|
||||||
cudaMemcpy(data_h, data_d, size*sizeof(value_type), cudaMemcpyDeviceToHost);
|
cudaMemcpy(data_h, data_d, size*sizeof(dnnType), cudaMemcpyDeviceToHost);
|
||||||
cudaMemcpy(correct_h, correct_d, size*sizeof(value_type), cudaMemcpyDeviceToHost);
|
cudaMemcpy(correct_h, correct_d, size*sizeof(dnnType), cudaMemcpyDeviceToHost);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
data_h = data_d;
|
data_h = data_d;
|
||||||
@@ -103,30 +103,30 @@ int checkResult(int size, value_type *data_d, value_type *correct_d, bool device
|
|||||||
return diffs;
|
return diffs;
|
||||||
}
|
}
|
||||||
|
|
||||||
void resize(int size, value_type **data)
|
void resize(int size, dnnType **data)
|
||||||
{
|
{
|
||||||
if (*data != NULL)
|
if (*data != NULL)
|
||||||
checkCuda( cudaFree(*data) );
|
checkCuda( cudaFree(*data) );
|
||||||
checkCuda( cudaMalloc(data, size*sizeof(value_type)) );
|
checkCuda( cudaMalloc(data, size*sizeof(dnnType)) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void matrixTranspose(cublasHandle_t handle, value_type* srcData, value_type* dstData, int rows, int cols) {
|
void matrixTranspose(cublasHandle_t handle, dnnType* srcData, dnnType* dstData, int rows, int cols) {
|
||||||
|
|
||||||
value_type *A = srcData, *clone = dstData;
|
dnnType *A = srcData, *clone = dstData;
|
||||||
int m = rows, n= cols;
|
int m = rows, n= cols;
|
||||||
checkCuda( cudaMemcpy(clone, A, m*n*sizeof(value_type), cudaMemcpyDeviceToDevice));
|
checkCuda( cudaMemcpy(clone, A, m*n*sizeof(dnnType), cudaMemcpyDeviceToDevice));
|
||||||
|
|
||||||
float const alpha(1.0);
|
float const alpha(1.0);
|
||||||
float const beta(0.0);
|
float const beta(0.0);
|
||||||
checkERROR( cublasSgeam( handle, CUBLAS_OP_T, CUBLAS_OP_N, m, n, &alpha, A, n, &beta, A, m, clone, m ));
|
checkERROR( cublasSgeam( handle, CUBLAS_OP_T, CUBLAS_OP_N, m, n, &alpha, A, n, &beta, A, m, clone, m ));
|
||||||
}
|
}
|
||||||
|
|
||||||
void matrixMulAdd( cublasHandle_t handle, value_type* srcData, value_type* dstData,
|
void matrixMulAdd( cublasHandle_t handle, dnnType* srcData, dnnType* dstData,
|
||||||
value_type* add_vector, int dim, value_type mul) {
|
dnnType* add_vector, int dim, dnnType mul) {
|
||||||
|
|
||||||
checkCuda( cudaMemcpy(dstData, add_vector, dim*sizeof(value_type), cudaMemcpyDeviceToDevice));
|
checkCuda( cudaMemcpy(dstData, add_vector, dim*sizeof(dnnType), cudaMemcpyDeviceToDevice));
|
||||||
|
|
||||||
value_type alpha = mul;
|
dnnType alpha = mul;
|
||||||
checkERROR( cublasSaxpy(handle, dim, &alpha, srcData, 1, dstData, 1));
|
checkERROR( cublasSaxpy(handle, dim, &alpha, srcData, 1, dstData, 1));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,11 +25,11 @@ int main() {
|
|||||||
tkDNN::NetworkRT netRT(&net);
|
tkDNN::NetworkRT netRT(&net);
|
||||||
|
|
||||||
// Load input
|
// Load input
|
||||||
value_type *data;
|
dnnType *data;
|
||||||
value_type *input_h;
|
dnnType *input_h;
|
||||||
readBinaryFile(input_bin, dim.tot(), &input_h, &data);
|
readBinaryFile(input_bin, dim.tot(), &input_h, &data);
|
||||||
|
|
||||||
value_type *out_data, *out_data2;
|
dnnType *out_data, *out_data2;
|
||||||
|
|
||||||
std::cout<<"CUDNN inference:\n"; {
|
std::cout<<"CUDNN inference:\n"; {
|
||||||
dim.print(); //print initial dimension
|
dim.print(); //print initial dimension
|
||||||
@@ -63,8 +63,8 @@ int main() {
|
|||||||
/*
|
/*
|
||||||
// Print real test
|
// Print real test
|
||||||
std::cout<<"\n==== CHECK RESULT ====\n";
|
std::cout<<"\n==== CHECK RESULT ====\n";
|
||||||
value_type *out;
|
dnnType *out;
|
||||||
value_type *out_h;
|
dnnType *out_h;
|
||||||
readBinaryFile(output_bin, dim.tot(), &out_h, &out);
|
readBinaryFile(output_bin, dim.tot(), &out_h, &out);
|
||||||
printDeviceVector(dim.tot(), out);
|
printDeviceVector(dim.tot(), out);
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -39,8 +39,8 @@ int main() {
|
|||||||
tkDNN::Softmax l7(&net);
|
tkDNN::Softmax l7(&net);
|
||||||
|
|
||||||
// Load input
|
// Load input
|
||||||
value_type *data;
|
dnnType *data;
|
||||||
value_type *input_h;
|
dnnType *input_h;
|
||||||
readBinaryFile(input_bin, dim.tot(), &input_h, &data);
|
readBinaryFile(input_bin, dim.tot(), &input_h, &data);
|
||||||
|
|
||||||
dim.print(); //print initial dimension
|
dim.print(); //print initial dimension
|
||||||
@@ -55,8 +55,8 @@ int main() {
|
|||||||
|
|
||||||
// Print real test
|
// Print real test
|
||||||
std::cout<<"\n==== CHECK CUDNN RESULT ====\n";
|
std::cout<<"\n==== CHECK CUDNN RESULT ====\n";
|
||||||
value_type *out;
|
dnnType *out;
|
||||||
value_type *out_h;
|
dnnType *out_h;
|
||||||
readBinaryFile(output_bin, dim.tot(), &out_h, &out);
|
readBinaryFile(output_bin, dim.tot(), &out_h, &out);
|
||||||
std::cout<<"Diff: "<<checkResult(dim.tot(), out, data)<<"\n";
|
std::cout<<"Diff: "<<checkResult(dim.tot(), out, data)<<"\n";
|
||||||
|
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ int main() {
|
|||||||
tkDNN::Activation l6(&net, CUDNN_ACTIVATION_RELU);
|
tkDNN::Activation l6(&net, CUDNN_ACTIVATION_RELU);
|
||||||
|
|
||||||
// Load input
|
// Load input
|
||||||
value_type *data;
|
dnnType *data;
|
||||||
value_type *input_h;
|
dnnType *input_h;
|
||||||
readBinaryFile(input_bin, dim.tot(), &input_h, &data);
|
readBinaryFile(input_bin, dim.tot(), &input_h, &data);
|
||||||
|
|
||||||
printDeviceVector(dim.tot(), data);
|
printDeviceVector(dim.tot(), data);
|
||||||
@@ -39,8 +39,8 @@ int main() {
|
|||||||
|
|
||||||
// Print real test
|
// Print real test
|
||||||
std::cout<<"\n==== CHECK RESULT ====\n";
|
std::cout<<"\n==== CHECK RESULT ====\n";
|
||||||
value_type *out;
|
dnnType *out;
|
||||||
value_type *out_h;
|
dnnType *out_h;
|
||||||
readBinaryFile(output_bin, dim.tot(), &out_h, &out);
|
readBinaryFile(output_bin, dim.tot(), &out_h, &out);
|
||||||
printDeviceVector(dim.tot(), out);
|
printDeviceVector(dim.tot(), out);
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ int main() {
|
|||||||
tkDNN::Region g14(&net, 80, 4, 5, 0.6f, g14_bin);
|
tkDNN::Region g14(&net, 80, 4, 5, 0.6f, g14_bin);
|
||||||
|
|
||||||
// Load input
|
// Load input
|
||||||
value_type *data;
|
dnnType *data;
|
||||||
value_type *input_h;
|
dnnType *input_h;
|
||||||
readBinaryFile(input_bin, dim.tot(), &input_h, &data);
|
readBinaryFile(input_bin, dim.tot(), &input_h, &data);
|
||||||
|
|
||||||
//print network model
|
//print network model
|
||||||
@@ -62,7 +62,7 @@ int main() {
|
|||||||
//convert network to tensorRT
|
//convert network to tensorRT
|
||||||
tkDNN::NetworkRT netRT(&net);
|
tkDNN::NetworkRT netRT(&net);
|
||||||
|
|
||||||
value_type *out_data, *out_data2; // cudnn output, tensorRT output
|
dnnType *out_data, *out_data2; // cudnn output, tensorRT output
|
||||||
|
|
||||||
tkDNN::dataDim_t dim1 = dim; //input dim
|
tkDNN::dataDim_t dim1 = dim; //input dim
|
||||||
printCenteredTitle(" CUDNN inference ", '=', 30); {
|
printCenteredTitle(" CUDNN inference ", '=', 30); {
|
||||||
@@ -83,7 +83,7 @@ int main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
printCenteredTitle(" CHECK RESULTS ", '=', 30);
|
printCenteredTitle(" CHECK RESULTS ", '=', 30);
|
||||||
value_type *out, *out_h;
|
dnnType *out, *out_h;
|
||||||
int out_dim = net.getOutputDim().tot();
|
int out_dim = net.getOutputDim().tot();
|
||||||
readBinaryFile(output_bin, out_dim, &out_h, &out);
|
readBinaryFile(output_bin, out_dim, &out_h, &out);
|
||||||
std::cout<<"CUDNN vs correct"; checkResult(out_dim, out_data, out);
|
std::cout<<"CUDNN vs correct"; checkResult(out_dim, out_data, out);
|
||||||
@@ -92,5 +92,6 @@ int main() {
|
|||||||
|
|
||||||
std::cout<<"\n\nDetected objects: \n";
|
std::cout<<"\n\nDetected objects: \n";
|
||||||
g14.interpretData();
|
g14.interpretData();
|
||||||
|
g14.showImageResult(input_h);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-4
@@ -100,8 +100,8 @@ int main() {
|
|||||||
tkDNN::Region g31(&net, 80, 4, 5, 0.6f, g31_bin);
|
tkDNN::Region g31(&net, 80, 4, 5, 0.6f, g31_bin);
|
||||||
|
|
||||||
// Load input
|
// Load input
|
||||||
value_type *data;
|
dnnType *data;
|
||||||
value_type *input_h;
|
dnnType *input_h;
|
||||||
readBinaryFile(input_bin, dim.tot(), &input_h, &data);
|
readBinaryFile(input_bin, dim.tot(), &input_h, &data);
|
||||||
|
|
||||||
//print network model
|
//print network model
|
||||||
@@ -110,7 +110,7 @@ int main() {
|
|||||||
//convert network to tensorRT
|
//convert network to tensorRT
|
||||||
tkDNN::NetworkRT netRT(&net);
|
tkDNN::NetworkRT netRT(&net);
|
||||||
|
|
||||||
value_type *out_data, *out_data2; // cudnn output, tensorRT output
|
dnnType *out_data, *out_data2; // cudnn output, tensorRT output
|
||||||
|
|
||||||
tkDNN::dataDim_t dim1 = dim; //input dim
|
tkDNN::dataDim_t dim1 = dim; //input dim
|
||||||
printCenteredTitle(" CUDNN inference ", '=', 30); {
|
printCenteredTitle(" CUDNN inference ", '=', 30); {
|
||||||
@@ -131,7 +131,7 @@ int main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
printCenteredTitle(" CHECK RESULTS ", '=', 30);
|
printCenteredTitle(" CHECK RESULTS ", '=', 30);
|
||||||
value_type *out, *out_h;
|
dnnType *out, *out_h;
|
||||||
int out_dim = net.getOutputDim().tot();
|
int out_dim = net.getOutputDim().tot();
|
||||||
readBinaryFile(output_bin, out_dim, &out_h, &out);
|
readBinaryFile(output_bin, out_dim, &out_h, &out);
|
||||||
std::cout<<"CUDNN vs correct"; checkResult(out_dim, out_data, out);
|
std::cout<<"CUDNN vs correct"; checkResult(out_dim, out_data, out);
|
||||||
@@ -140,5 +140,6 @@ int main() {
|
|||||||
|
|
||||||
std::cout<<"\n\nDetected objects: \n";
|
std::cout<<"\n\nDetected objects: \n";
|
||||||
g31.interpretData();
|
g31.interpretData();
|
||||||
|
g31.showImageResult(input_h);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user