yolo TensorRT almost DONE

This commit is contained in:
Francesco Gatti
2017-08-03 15:52:08 +02:00
parent 2ef76209a1
commit 858b3501fa
6 changed files with 96 additions and 7 deletions
+31
View File
@@ -1,10 +1,12 @@
#include <iostream>
#include <map>
#include "NvInfer.h"
#include "NetworkRT.h"
using namespace nvinfer1;
#include "pluginsRT/ActivationLeakyRT.cpp"
#include "pluginsRT/ReorgRT.cpp"
// Logger for info/warning/errors
class Logger : public ILogger
@@ -17,6 +19,8 @@ class Logger : public ILogger
namespace tkDNN {
std::map<Layer*, nvinfer1::ITensor*>tensors;
NetworkRT::NetworkRT(Network *net) {
builderRT = createInferBuilder(loggerRT);
@@ -33,6 +37,7 @@ NetworkRT::NetworkRT(Network *net) {
for(int i=0; i<net->num_layers; i++) {
Layer *l = net->layers[i];
input = convert_layer(input, l);
tensors[l] = input;
}
if(input == NULL)
FatalError("conversion failed");
@@ -102,6 +107,10 @@ ITensor* NetworkRT::convert_layer(ITensor *input, Layer *l) {
return convert_layer(input, (Activation*) l);
if(type == LAYER_SOFTMAX)
return convert_layer(input, (Softmax*) l);
if(type == LAYER_ROUTE)
return convert_layer(input, (Route*) l);
if(type == LAYER_REORG)
return convert_layer(input, (Reorg*) l);
FatalError("Layer not implemented in tensorRT");
return NULL;
@@ -206,4 +215,26 @@ ITensor* NetworkRT::convert_layer(ITensor *input, Softmax *l) {
return lRT->getOutput(0);
}
ITensor* NetworkRT::convert_layer(ITensor *input, Route *l) {
std::cout<<"convert route\n";
ITensor *tens[256];
for(int i=0; i<l->layers_n; i++)
tens[i] = tensors[l->layers[i]];
IConcatenationLayer *lRT = networkRT->addConcatenation(tens, l->layers_n);
checkNULL(lRT);
return lRT->getOutput(0);
}
ITensor* NetworkRT::convert_layer(ITensor *input, Reorg *l) {
std::cout<<"convert Reorg\n";
std::cout<<"New plugin REORG\n";
IPlugin *plugin = new ReorgRT(l->stride);
IPluginLayer *lRT = networkRT->addPlugin(&input, 1, *plugin);
checkNULL(lRT);
return lRT->getOutput(0);
}
}
+58
View File
@@ -0,0 +1,58 @@
#include<cassert>
#include "kernels.h"
class ReorgRT : public IPlugin {
public:
ReorgRT(int stride) {
this->stride = stride;
}
~ReorgRT(){
}
int getNbOutputs() const override {
return 1;
}
Dims getOutputDimensions(int index, const Dims* inputs, int nbInputDims) override {
return DimsCHW{inputs[0].d[0]*stride*stride, inputs[0].d[1]/stride, inputs[0].d[2]/stride};
}
void configure(const Dims* inputDims, int nbInputs, const Dims* outputDims, int nbOutputs, int maxBatchSize) override {
c = inputDims[0].d[0];
h = inputDims[0].d[1];
w = inputDims[0].d[2];
}
int initialize() override {
return 0;
}
virtual void terminate() override {
}
virtual size_t getWorkspaceSize(int maxBatchSize) const override {
return 0;
}
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]),
reinterpret_cast<value_type*>(outputs[0]),
batchSize, c, h, w, stride);
return 0;
}
virtual size_t getSerializationSize() override {
return 0;
}
virtual void serialize(void* buffer) override {
}
int c, h, w, stride;
};
+1 -1
View File
@@ -70,7 +70,7 @@ int checkResult(int size, value_type *data_d, value_type *correct_d, bool device
if(fabs(data_h[i] - correct_h[i]) > 0.0001) {
diffs += 1;
if(diffs < 10)
printf("%f %f\n", data_h[i], correct_h[i]);
printf("%d: %f %f\n", i, data_h[i], correct_h[i]);
}
}