gpt4 book ai didi

neural-network - cv::MAT 如何转换为 NHCW 格式?

转载 作者:行者123 更新时间:2023-12-04 16:10:58 26 4
gpt4 key购买 nike

在User Guide.html中,tensorRT的输入/输出需要使用NCHW格式。
NCHW 格式是什么?
如何将 cv::MAT 转换为 NCHW 格式?

我像下面的代码一样使用 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);

最佳答案

NCHW:对于 3 channel 图像,比如 BGR,首先存储 B channel 的像素,然后是 G channel ,最后是 R channel 。

NHWC:对于每个像素,其 3 种颜色按 BGR 顺序存储在一起。

TensorRT 要求您的图像数据采用 NCHW 顺序。但是 OpenCV 以 NHWC 顺序读取它。您可以编写一个简单的函数来将数据从 NHWC 读取到一个缓冲区,您可以在缓冲区中按 NCHW 顺序存储它们。将此缓冲区复制到设备内存并传递给 TensorRT。

您可以在 TensorRT 安装的 samples/sampleFasterRCNN/sampleFasterRCNN.cpp 文件中找到此操作的示例。它读取 PPM 文件,该文件也是 NHWC 顺序,然后将其转换为 NCHW 顺序并减去平均值,这两个步骤都在一个步骤中完成。您可以修改它以满足您的目的。

关于neural-network - cv::MAT 如何转换为 NHCW 格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41637162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com