直接说关键,yolo11相较于yolov8的层方面有改动,目前可以使用yolov8的加载方式加载yolo11模型,但是要禁用层融合。
net.enableFusion(false); // 禁用层融合
在inference.cpp文件加载onnx时加入禁用,便可以正常加载
void Inference::loadOnnxNetwork()
{
net = cv::dnn::readNetFromONNX(modelPath);
if (cudaEnabled)
{
std::cout << "\nRunning on CUDA" << std::endl;
net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);
}
else
{
std::cout << "\nRunning on CPU" << std::endl;
net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
}
net.enableFusion(false); // 禁用层融合
}
我说的inference.cpp文件和示例在yolo的github克隆后的examples目录,YOLOv8-CPP-Inference中。这个是使用opencvdnn模块加载,如果opencv是编译支持了cuda,那速度是飞一般提升。我的模型可以得到100帧每秒