v8定位模型,使用官方代码,推理结果为杂乱无章的定位框或者框都在左上角。
调试后发现是后处理代码处,对输出头的形状处理不正确,已修正
位置原代码inference.cpp第224行,后处理部分
原代码:
int strideNum = outputNodeDims[1];//8400
int signalResultNum = outputNodeDims[2];//84
std::vector<int> class_ids;
std::vector<float> confidences;
std::vector<cv::Rect> boxes;
cv::Mat rawData;
if (modelType == YOLO_DETECT_V8)
{
// FP32
rawData = cv::Mat(strideNum, signalResultNum, CV_32F, output);
}
else
{
// FP16
rawData = cv::Mat(strideNum, signalResultNum, CV_16F, output);
rawData.convertTo(rawData, CV_32F);
}
float* data = (float*)rawData.data;
修改后代码:
int strideNum = outputNodeDims[2];//8400
int signalResultNum = outputNodeDims[1];//84
std::vector<int> class_ids;
std::vector<float> confidences;
std::vector<cv::Rect> boxes;
cv::Mat rawData;
cv::Mat transposed_output;
if (modelType == YOLO_DETECT_V8)
{
// FP32
//rawData = cv::Mat(strideNum, signalResultNum, CV_32F, output);
rawData = cv::Mat(signalResultNum, strideNum, CV_32F, output);
cv::transpose(rawData, transposed_output);
}
else
{
// FP16
rawData = cv::Mat(signalResultNum, strideNum, CV_16F, output);
rawData.convertTo(rawData, CV_32F);
cv::transpose(rawData, transposed_output);
}
//float* data = (float*)rawData.data;
float* data = (float*)transposed_output.data;
修改后定位框准确无误