vector<vector<float>> Yolov5PostProcess::ThresholdFliter(float **data) { vector<vector<float>> results; int stride[] = {8, 16, 32}; for(int i = 0; i < 3; i++) { float *stride_data = data[i]; int stride_w = (img_size_w / stride[i]); int stride_h = (img_size_h / stride[i]); int offset = 5 + classes; int tmp_cnt = 0; for(int h = 0; h < stride_h; h++){ for(int w = 0; w < stride_w; w++){ for(int c = 0; c < 3; c++){ float* data = stride_data + (h * stride_w +w)*3*offset + c * offset; if(data[4] > th_log) { float max_idx = 0; float max_score = -1; for(int cls = 0; cls < classes; cls++) { if(data[5+cls] > max_score){ max_score = data[5+cls]; max_idx = cls; } } float conf = fastSigmoid(data[4]); max_score = fastSigmoid(max_score) * conf; if (max_score > th) { vector<float> result(7); result[0] = (fastSigmoid(data[0]) * 2.f - 0.5f + w) *stride[i]; result[1] = (fastSigmoid(data[1]) * 2.f - 0.5f + h) *stride[i]; result[2] = (float)pow(fastSigmoid(data[2]) * 2.f, 2) * anchors[i][c * 2 + 0]; //*stride[i]; result[3] = (float)pow(fastSigmoid(data[3]) * 2.f, 2) * anchors[i][c * 2 + 1]; //*stride[i]; result[4] = conf; result[5] = max_idx; result[6] = max_score; results.push_back(result); tmp_cnt++; } } //end if } //end for c } //end for w } //end for h cout<<"[in post] thresh calc num: " <<tmp_cnt<<endl; } return results; } 详细解读一下这段代码
时间: 2024-02-10 17:34:18 浏览: 73
这段代码是YOLOv5后处理的一部分。YOLOv5是一种目标检测算法,它将输入图像划分为不同大小的网格,每个网格预测一组边界框和它们对应的置信度和类别概率。这段代码的作用是:根据置信度阈值和类别置信度阈值,筛选出预测的边界框。
首先,定义一个vector<vector<float>>类型的变量results,用于保存筛选后的边界框;定义一个int类型的数组stride,用于保存不同大小的网格的步长。
然后,对于每个步长stride[i],计算网格的宽度stride_w和高度stride_h。偏移量offset等于5加上类别数。接下来,对于每个网格中的每个预测框,首先判断其置信度是否大于阈值th_log。如果小于阈值,则视为背景,不予考虑。如果大于阈值,则继续进行筛选。
在筛选过程中,首先找到类别置信度最高的类别,计算其置信度max_score和对应的类别max_idx。然后,计算综合置信度,即将置信度和类别置信度相乘得到综合置信度。如果综合置信度大于阈值th,则认为该预测框是有效的,将其保存在results中。
对于保存的每个预测框,它包含7个元素,分别表示:左上角x坐标、左上角y坐标、宽度、高度、综合置信度、类别索引和类别置信度。最后,返回保存筛选后的边界框的results。
相关问题
vector<vector<float>> det拷贝到vector<vector<float>> *results
好的,您可以使用以下代码将det拷贝到results中:
```
vector<vector<float>>* results = new vector<vector<float>>();
*results = det;
```
这将创建一个指向vector<vector<float>>类型的指针results,并将det的值复制到results指向的内存空间中。现在您可以使用results来访问和操作det的值了。
vector<vector<float>> det深拷贝到vector<vector<float>> *results
好的,您可以使用以下代码将det深拷贝到results中:
```
vector<vector<float>>* results = new vector<vector<float>>();
for (const auto& row : det) {
results->push_back(vector<float>(row.begin(), row.end()));
}
```
这将创建一个指向vector<vector<float>>类型的指针results,并使用for循环将det的每一行向量深拷贝到results中。现在您可以使用results来访问和操作det的值了,并且对results的修改不会影响到原始的det。
阅读全文