2017-01-13 1 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 : B 채널의 3 채널 이미지의 경우 B 채널의 픽셀이 먼저 저장된 다음 G 채널과 마지막으로 R 채널이 저장됩니다.

NHWC : 각 픽셀에 대해 3 가지 색상이 BGR 순서로 함께 저장됩니다.

TensorRT는 NCHW 순서로 이미지 데이터가 필요합니다. 그러나 OpenCV는 그것을 NHWC 명령으로 읽습니다. NHWC에서 NCHW 순서로 저장하는 버퍼로 데이터를 읽는 간단한 함수를 작성할 수 있습니다. 이 버퍼를 장치 메모리로 복사하고 TensorRT로 전달합니다.

TensorRT 설치의 samples/sampleFasterRCNN/sampleFasterRCNN.cpp 파일에서이 작업의 예를 찾을 수 있습니다. 또한 NHWC 순서에있는 PPM 파일을 읽은 다음 NCHW 순서로 변환하고 평균값을 한 단계로 뺍니다. 당신은 당신의 목적에 맞게 수정할 수 있습니다.

관련 문제