Closed yuyaoliang closed 9 months ago
第一个问题,你根据 TensorRT 的版本进行切换了么,例如: https://github.com/Natsu-Akatsuki/RangeNetTrt8/blob/67a7bfbf11258ecf1a47d58e691d3930fce20c6c/src/network/netTensorRT.cpp#L287
您好,有些超参数写死了,不知道你改了没有,例如:
我在这里做了相应的修改,不过我不理解为什么是{1, 1, 64, 2048}而不是{1, 5, 64, 2048}
const at::Tensor range_img_torch =
torch::from_blob((float *)range_img, {1, 1, 128, 1024}).to(device_);
at::Tensor range_torch =
torch::from_blob((float *)range_arr, {point_num}).to(device_);
const at::Tensor label_img_torch =
torch::from_blob((float *)label_img, {1, 1, 128, 1024})
.to(device_)
.toType(torch::kFloat32);
const at::Tensor px_torch =
torch::from_blob((float *)pxs, {point_num}).to(device_);
const at::Tensor pys_torch =
torch::from_blob((float *)pys, {point_num}).to(device_);
int img_width = 1024;
第一个问题,你根据 TensorRT 的版本进行切换了么,例如:
这里我也做了相应的修改,但还是会有部分点云标签为-1
config->setFlag(nvinfer1::BuilderFlag::kTF32);
config->setMaxWorkspaceSize(5UL << 30);
config->setFlag(BuilderFlag::kPREFER_PRECISION_CONSTRAINTS);
auto network = std::unique_ptr<nvinfer1::INetworkDefinition>(
builder->createNetworkV2(explicitBatch));
assert(network != nullptr);
// generate a parser to get weights from onnx file
auto parser = std::unique_ptr<nvonnxparser::IParser>(
nvonnxparser::createParser(*network, _gLogger));
parser->parseFromFile(onnx_path.c_str(),
static_cast<int>(Logger::Severity::kWARNING));
auto ktop_layer = network->addTopK(*network->getOutput(0),
nvinfer1::TopKOperation::kMAX, 1, 2);
assert(ktop_layer != nullptr);
ktop_layer->setName("topKLayer");
// 将原始网络的输出替换为 addTopK 层的输出
network->unmarkOutput(*network->getOutput(0));
std::cout << network->getNbOutputs() << std::endl;
network->markOutput(*ktop_layer->getOutput(1));
// 防止该层转换为 16 位时数据溢出
// 1-236 层的权值类型设置为 FP16
// 236-237 层的权值类型设置为 FP32
// 237 层的权值类型设置为 INT32
// 使用 TensorRT 8.2 版本时 start 应设置为 236
// 使用 TensorRT 8.4 版本时 start 应设置为 235
int start = 177;
int end = 179;
for (int i = start; i <= end; i++) {
auto layer = network->getLayer(i);
std::string layerName = layer->getName();
layer->setPrecision(nvinfer1::DataType::kFLOAT);
}
auto layer = network->getLayer(180);
// note:ktop 层输出为整型
std::string layerName = layer->getName();
layer->setPrecision(nvinfer1::DataType::kINT32);
我看您填的是177-179 这几层,您为什么这么填。原来的模型,我这边是用二分法的方法试出来的,原因和步骤可参考 https://github.com/Natsu-Akatsuki/RangeNetTrt8/issues/8。这边新的模型,可能要自己试一试。
您好,有些超参数写死了,不知道你改了没有,例如: https://github.com/Natsu-Akatsuki/RangeNetTrt8/blob/67a7bfbf11258ecf1a47d58e691d3930fce20c6c/src/utils/postprocess.cpp#L49
我在这里做了相应的修改,不过我不理解为什么是{1, 1, 64, 2048}而不是{1, 5, 64, 2048}
const at::Tensor range_img_torch = torch::from_blob((float *)range_img, {1, 1, 128, 1024}).to(device_); at::Tensor range_torch = torch::from_blob((float *)range_arr, {point_num}).to(device_); const at::Tensor label_img_torch = torch::from_blob((float *)label_img, {1, 1, 128, 1024}) .to(device_) .toType(torch::kFloat32); const at::Tensor px_torch = torch::from_blob((float *)pxs, {point_num}).to(device_); const at::Tensor pys_torch = torch::from_blob((float *)pys, {point_num}).to(device_); int img_width = 1024;
这个是已经后处理阶段了吧。后处理阶段的深度图就是 label image。已经不是 feature image 了。 另外这个 TensorRT 模型的最终输出应该也是 [1, 1, 128, 1024](按您的深度图的话),您这个 5 是怎么来的。第二个维度RangeNet 用 1 就好了。
我猜您这应该就是访问越界的问题,就是跟我设置的输入不一致,但哪里不一致,您可能要 check 一下
我看您填的是177-179 这几层,您为什么这么填。原来的模型,我这边是用二分法的方法试出来的,原因和步骤可参考 https://github.com/Natsu-Akatsuki/RangeNetTrt8/issues/8。这边新的模型,可能要自己试一试。
填177-179 这几层应该是重复设置了,我在最开始已经设置config->setFlag(nvinfer1::BuilderFlag::kTF32);
,这样除了最后一层是int32,其他都是kTF32对吧?但是这种情况下还是会出现部分点云类别为-1
嗯,补充一下,这个是回复这个的 config->setFlag(nvinfer1::BuilderFlag::kFP16);设置为16时推理标签结果全为-1
我看您填的是177-179 这几层,您为什么这么填。原来的模型,我这边是用二分法的方法试出来的,原因和步骤可参考 https://github.com/Natsu-Akatsuki/RangeNetTrt8/issues/8。这边新的模型,可能要自己试一试。
然后关于您部分 -1 的问题,你可以参考 https://github.com/Natsu-Akatsuki/RangeNetTrt8/blob/67a7bfbf11258ecf1a47d58e691d3930fce20c6c/src/network/netTensorRT.cpp#L69 线尝试可视化深度图看一看 image-representation 的点云是怎样的,来排除是模型的问题,还是 reproject 2D -> 3D 的问题
大佬您好,我用自己的固态雷达数据训练的网络,深度图大小设置为128*1024,用python训练推理和使用KNN都没问题,但是用您的代码出现两个问题: 1.config->setFlag(nvinfer1::BuilderFlag::kFP16);设置为16时推理标签结果全为-1,我改为TF32后,情况好转,但仍有部分区域标签结果为-1,显示为黑的
2.上诉结果是我在未开启KNN后处理的情况下得到的,我开启后处理 isPostprocess = true后推理报错如下:
想问大佬有什么建议或思路吗