2017-01-13 23 views
1

User Guide.htmlでは、tensorRTの入出力にNCHW形式を使用する必要があります。
NCHWは何ですか?
cv :: MATをNCHW形式に変換するにはどうすればよいですか?TensorRT:cv :: MATをNHCW形式に変換する方法は?

私はTensorRTを使用して以下のコードを推論します。
何もエラーがありません。しかし、それは結果の正しい結果ではありません。

int batchSize = 1; 
int size_of_single_input = 256 * 256 * 3 * sizeof(float); 
int size_of_single_output = 100 * 1 * 1 * sizeof(float); 

IBuilder* builder = createInferBuilder(gLogger); 

INetworkDefinition* network = builder->createNetwork(); 

CaffeParser parser; 
auto blob_name_to_tensor = parser.parse(“deploy.prototxt”, 
             "sample.caffemodel", 
             *network, 
             DataType::kFLOAT); 

network->markOutput(*blob_name_to_tensor->find("prob")); 

builder->setMaxBatchSize(1); 
builder->setMaxWorkspaceSize(1 << 30); 
ICudaEngine* engine = builder->buildCudaEngine(*network); 

IExecutionContext *context = engine->createExecutionContext(); 

int inputIndex = engine->getBindingIndex(INPUT_LAYER_NAME), 
int outputIndex = engine->getBindingIndex(OUTPUT_LAYER_NAME); 

cv::Mat input; 
input = imread("./sample.jpg"); 
cvtColor(input, input, CV_BGR2RGB); 
cv::resize(input, input, cv::Size(256, 256)); 

float output[OUTPUTSIZE]; 

void* buffers = malloc(engine->getNbBindings() * sizeof(void*)); 
cudaMalloc(&buffers[inputIndex], batchSize * size_of_single_input); 
cudaMalloc(&buffers[outputIndex], batchSize * size_of_single_output); 

cudaStream_t stream; 
cudaStreamCreate(&stream); 

cudaMemcpyAsync(buffers[inputIndex], (float *)input, 
       batchSize * size_of_single_input, 
       cudaMemcpyHostToDevice, stream); 

context.enqueue(batchSize, buffers, stream, nullptr); 


cudaMemcpyAsync(output, buffers[outputIndex], 
       batchSize * size_of_single_output, 
       cudaMemcpyDeviceToHost, stream)); 

cudaStreamSynchronize(stream); 

助けてください。

+0

「MCVEページ」(http://stackoverflow.com/help/mcve)をご覧になり「質問」を改善するための指示に従ってください。 cudaタグに関する質問毎日悪化する... – Taro

答えて

0

NCHW:3チャンネルの画像、たとえばBGRの場合、Bチャンネルのピクセルが最初に格納され、次にGチャンネル、最後にRチャンネルが格納されます。

NHWC:各ピクセルについて、その3つの色はBGRの順序で一緒に格納されます。

TensorRTでは、画像データをNCHW順に並べる必要があります。しかしOpenCVはそれをNHWCの命令で読む。 NHWCのデータをNCHWの順序でバッファに保存する単純な関数を書くことができます。このバッファをデバイスメモリにコピーし、TensorRTに渡します。

この操作の例は、TensorRTインストールのsamples/sampleFasterRCNN/sampleFasterRCNN.cppファイルにあります。これはNHWCの順番でもあるPPMファイルを読み込み、それをNCHWの順序に変換し、平均値を1ステップで減算します。あなたはあなたの目的に合うように修正することができます。

関連する問題