> 技术文档 > OpenCV结合深度学习进行图像分类

OpenCV结合深度学习进行图像分类


文章目录

    • 1. 支持的深度学习框架和模型格式
    • 2. 模型加载方式
      • 加载预训练模型示例:
    • 3. 图像预处理流程
    • 4. 前向传播与推理
    • 5. 结果解析与后处理
    • 6. 性能优化技巧
      • 启用GPU加速:
      • 批量处理:

代码示例在资源中有上传

1. 支持的深度学习框架和模型格式

OpenCV的DNN模块支持多种主流深度学习框架训练的模型:

  • TensorFlow: 支持冻结图(.pb)和SavedModel格式
  • Caffe: 支持.prototxt和.caffemodel文件
  • ONNX: 开放神经网络交换格式
  • Darknet: YOLO系列模型
  • Torch: PyTorch导出模型

2. 模型加载方式

加载预训练模型示例:

import cv2import 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))