CV

深度神经网络(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_NEW
新引擎

5.0 新引擎;目前仅支持 CPU 后端,ONNX 覆盖率大幅提升。

ENGINE_AUTO
自动(默认)

优先尝试新引擎,失败时回退经典引擎。readNet 的默认参数。

ENGINE_ORT
ONNX Runtime

ONNX 专用包装;需以 WITH_ONNXRUNTIME=ON 构建 OpenCV。

注意:新引擎目前不支持非 CPU 后端。若需 CUDA/OpenVINO/Vulkan,请使用 ENGINE_CLASSIC 或 ENGINE_AUTO 的回退路径。

计算后端(Backend)

DNN_BACKEND_DEFAULT
默认

由 CMake 或配置参数决定

DNN_BACKEND_OPENCV
OpenCV

内置 CPU/OpenCL 实现

DNN_BACKEND_INFERENCE_ENGINE
OpenVINO

Intel OpenVINO;目标含 CPU/OpenCL/MYRIAD/HDDL/NPU

DNN_BACKEND_CUDA
CUDA

NVIDIA GPU

DNN_BACKEND_VKCOM
Vulkan

Vulkan 计算

DNN_BACKEND_WEBNN
WebNN

浏览器神经网络 API

DNN_BACKEND_TIMVX
tim-VX

NPU(如瑞芯微)

DNN_BACKEND_CANN
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*.onnxreadNetFromONNX5.0 首选格式;Hugging Face 托管
TensorFlow*.pb / *.pbtxtreadNetFromTensorflow冻结图 + 可选文本配置
OpenVINO*.xml + *.binreadNetFromModelOptimizerIntel 中间表示
TFLite*.tflitereadNetFromTFLite移动端轻量模型
Caffe*.caffemodel + *.prototxtreadNetFromCaffe经典检测模型
Darknet*.weights + *.cfgreadNetFromDarknetYOLO 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。

  • softNMSBoxes

    Soft-NMS(线性 / 高斯衰减)。

  • enableModelDiagnostics

    模型加载详细日志,排查未实现层等问题。

高层 Model API

  • ClassificationModel分类模型高层 API
  • DetectionModel目标检测高层 API
  • SegmentationModel语义分割高层 API
  • KeypointsModel关键点模型高层 API
  • TextDetectionModel_EAST / _DB文本检测(EAST / DB)
  • TextRecognitionModel文本识别高层 API

均继承自 cv::dnn::Model 基类。

Python 推理示例
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])
C++ 推理示例
#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 后端,可按平台选择最优执行路径。

来源:docs.opencv.org/5.0/main_modules/dnn.html