推理(score model & input tensor, get back output tensor) auto output_tensors = session.Run(Ort::RunOptions{ nullptr }, input_node_names.data(), input_tensors.data(), input_names.size(), output_node_names.data(), output_node_names.size()); endTime = clock(); assert(output_tensors.size() == 1 && output_tensors.front().IsTensor()); //除了第一个节点外,其他参数与原网络对应不上程序就会无法执行 //第二个参数代表输入节点的名称集合 //第四个参数1代表输入层的数目 //第五个参数代表输出节点的名称集合 //最后一个参数代表输出节点的数目 获取输出(Get pointer to output tensor float values) float* floatarr = output_tensors[0].GetTensorMutableData<float>(); // 也可以使用output_tensors.front(); 获取list中的第一个元素变量 list.pop_front(); 删除list中的第一个位置的元素 // 得到最可能分类输出 Mat newarr = Mat_<double>(1, 1000); //定义一个1*1000的矩阵 for (int i = 0; i < newarr.rows; i++) { for (int j = 0; j < newarr.cols; j++) //矩阵列数循环 { newarr.at<double>(i, j) = floatarr[j]; } } /*cout << newarr.size() << endl;*/
vector<String> labels = readClassNames(); for (int n = 0; n < newarr.rows; n++) { Point classNumber; double classProb; Mat probMat = newarr(Rect(0, n, 1000, 1)).clone(); Mat result = probMat.reshape(1, 1); minMaxLoc(result, NULL, &classProb, NULL, &classNumber); int classidx = classNumber.x; printf("\n current image classification : %s, possible : %.2f\n", labels.at(classidx).c_str(), classProb);