深度神经网络(DNN)
dnn 模块提供层创建 API、内置常用层、网络构建与修改,以及从各框架加载序列化模型的能力。功能仅限前向计算(推理),不支持训练。
仅前向推理
dnn 模块只支持 forward pass(网络测试/推理),不支持网络训练。训练请使用 PyTorch、TensorFlow 等框架后导出。
层(Layer)体系
提供新层创建 API、常用内置层、从层构建与修改网络的 API,以及从各框架加载序列化模型的功能。
5.0 新一代引擎
ONNX 规范覆盖从 4.x 的不足 23% 提升至 80% 以上;集成 ONNX Runtime;推荐模型托管于 Hugging Face。
DNN 引擎选择(5.0 新特性)
readNet(..., engine=) 参数;默认 ENGINE_AUTO。
ENGINE_CLASSIC与 4.x 分支类似的传统 DNN 引擎;当前唯一支持非 CPU 后端的引擎。
ENGINE_NEW5.0 新引擎;目前仅支持 CPU 后端,ONNX 覆盖率大幅提升。
ENGINE_AUTO优先尝试新引擎,失败时回退经典引擎。readNet 的默认参数。
ENGINE_ORTONNX 专用包装;需以 WITH_ONNXRUNTIME=ON 构建 OpenCV。
计算后端(Backend)
DNN_BACKEND_DEFAULT由 CMake 或配置参数决定
DNN_BACKEND_OPENCV内置 CPU/OpenCL 实现
DNN_BACKEND_INFERENCE_ENGINEIntel OpenVINO;目标含 CPU/OpenCL/MYRIAD/HDDL/NPU
DNN_BACKEND_CUDANVIDIA GPU
DNN_BACKEND_VKCOMVulkan 计算
DNN_BACKEND_WEBNN浏览器神经网络 API
DNN_BACKEND_TIMVXNPU(如瑞芯微)
DNN_BACKEND_CANN华为昇腾
目标设备(Target)
DNN_TARGET_CPUDNN_TARGET_OPENCLDNN_TARGET_OPENCL_FP16DNN_TARGET_CUDADNN_TARGET_CUDA_FP16DNN_TARGET_VULKANDNN_TARGET_MYRIADDNN_TARGET_HDDLDNN_TARGET_NPUDNN_TARGET_FPGADNN_TARGET_CPU_FP16支持的模型格式
| 框架 | 文件 | 加载函数 | 说明 |
|---|---|---|---|
| ONNX | *.onnx | readNetFromONNX | 5.0 首选格式;Hugging Face 托管 |
| TensorFlow | *.pb / *.pbtxt | readNetFromTensorflow | 冻结图 + 可选文本配置 |
| OpenVINO | *.xml + *.bin | readNetFromModelOptimizer | Intel 中间表示 |
| TFLite | *.tflite | readNetFromTFLite | 移动端轻量模型 |
| Caffe | *.caffemodel + *.prototxt | readNetFromCaffe | 经典检测模型 |
| Darknet | *.weights + *.cfg | readNetFromDarknet | YOLO v1-v4 |
通用入口:cv::dnn::readNet(model, config, framework, engine) 会自动检测框架格式。
常用 API
blobFromImage从图像创建 4 维 NCHW blob;可选 resize、中心裁剪、减均值、缩放、BGR↔RGB。顺序:(input - mean) × scalefactor。
blobFromImageWithParams配合 Image2BlobParams 满足更复杂的预处理(如 letterbox,YOLO 常用)。
imagesFromBlob将 4D blob 还原为 vector<Mat> 图像列表。
NMSBoxes / NMSBoxesBatched非极大值抑制;批量版支持跨类别 class_ids。
softNMSBoxesSoft-NMS(线性 / 高斯衰减)。
enableModelDiagnostics模型加载详细日志,排查未实现层等问题。
高层 Model API
ClassificationModel分类模型高层 APIDetectionModel目标检测高层 APISegmentationModel语义分割高层 APIKeypointsModel关键点模型高层 APITextDetectionModel_EAST / _DB文本检测(EAST / DB)TextRecognitionModel文本识别高层 API
均继承自 cv::dnn::Model 基类。
import cv2
# 加载 ONNX 模型(ENGINE_AUTO:优先新引擎)
net = cv2.dnn.readNet("model.onnx")
# 图像 → blob(NCHW)
img = cv2.imread("bus.jpg")
blob = cv2.dnn.blobFromImage(
img, scalefactor=1/255.0, size=(640, 640),
mean=(0, 0, 0), swapRB=True, crop=False
)
net.setInput(blob)
outs = net.forward(net.getUnconnectedOutLayersNames())
# NMS 后处理示意
indices = cv2.dnn.NMSBoxes(bboxes, scores, 0.5, 0.4)
for i in indices.flatten():
print(bboxes[i], scores[i])#include <opencv2/dnn.hpp>
#include <opencv2/imgcodecs.hpp>
cv::Mat img = cv::imread("bus.jpg");
cv::Mat blob = cv::dnn::blobFromImage(
img, 1/255.0, {640, 640}, {}, true);
cv::dnn::Net net = cv::dnn::readNet("model.onnx");
net.setInput(blob);
std::vector<cv::Mat> outs;
net.forward(outs, net.getUnconnectedOutLayersNames());模型生态:Hugging Face
官方推荐
5.0 起推荐从 Hugging Face 获取与分享 ONNX 模型,配合新引擎获得最全算子覆盖。
算子覆盖
新引擎 ONNX 覆盖率 > 80%(4.x 不足 23%),常见检测/分类/分割模型可直接加载。
性能
配合 Universal Intrinsics 2.0 与 Vulkan/CUDA 后端,可按平台选择最优执行路径。