文章目录
代码示例在资源中有上传
1. 支持的深度学习框架和模型格式
OpenCV的DNN模块支持多种主流深度学习框架训练的模型:
- TensorFlow: 支持冻结图(.pb)和SavedModel格式
- Caffe: 支持.prototxt和.caffemodel文件
- ONNX: 开放神经网络交换格式
- Darknet: YOLO系列模型
- Torch: PyTorch导出模型
2. 模型加载方式
加载预训练模型示例:
import cv2
import numpy as np
# 方法1: 加载Caffe模型 (如CaffeNet, VGG等)
net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'model.caffemodel')
# 方法2: 加载TensorFlow模型
net = cv2.dnn.readNetFromTensorflow('frozen_inference_graph.pb')
# 方法3: 加载ONNX模型
net = cv2.dnn.readNetFromONNX('model.onnx')
# 方法4: 加载Darknet模型 (YOLO)
net = cv2.dnn.readNetFromDarknet('yolo.cfg', 'yolo.weights')
3. 图像预处理流程
深度学习模型对输入图像有特定要求,需要进行标准化处理:
# 读取原始图像
image = cv2.imread('input_image.jpg')
(h, w) = image.shape[:2]
# 创建blob对象 - OpenCV的标准化处理函数
blob = cv2.dnn.blobFromImage(
image, # 输入图像
scalefactor=1.0, # 缩放因子 (通常为1/255.0进行归一化)
size=(224, 224), # 目标尺寸 (根据模型要求调整)
mean=(104, 117, 123), # 减去的均值 (RGB格式)
swapRB=True, # 是否交换R和B通道 (BGR转RGB)
crop=False # 是否中心裁剪
)
# blob的形状为 (1, 3, 224, 224) - (batch, channels, height, width)
4. 前向传播与推理
# 设置网络输入
net.setInput(blob)
# 可选:设置计算后端和目标设备
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU) # 或DNN_TARGET_CUDA
# 执行前向传播获得预测结果
predictions = net.forward()
# 输出形状通常为 (1, num_classes) 或 (1, num_classes, 1, 1)
5. 结果解析与后处理
# 压缩多余维度
predictions = predictions.flatten()
# 获取前N个最可能的类别
top_indices = np.argsort(predictions)[::-1][:5] # Top-5分类结果
# 加载类别标签 (如ImageNet的1000个类别)
classes = open('synset_words.txt').read().strip().split("\n")
# 显示分类结果
for i, idx in enumerate(top_indices):
label = classes[idx]
confidence = predictions[idx]
print(f"{i+1}. {label}: {confidence:.4f}")
6. 性能优化技巧
启用GPU加速:
# CUDA加速 (需要编译支持CUDA的OpenCV)
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)
批量处理:
# 处理多张图像
images = [cv2.imread(f'image_{i}.jpg') for i in range(batch_size)]
blob = cv2.dnn.blobFromImages(images, 1.0, (224, 224), (104, 117, 123))