《OpenCV》——DNN模块

DNN模块是什么?

在这里插入图片描述
OpenCV 的 DNN 模块是在 OpenCV 3.3 版本引入的,它旨在为开发者提供一个统一的接口,以便在 OpenCV 框架内加载、部署和运行各种预训练的深度神经网络模型。该模块支持多种深度学习框架训练的模型,无需额外安装复杂的深度学习库,就能在不同平台上实现高效的推理。

DNN模块的特点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

支持的模型格式

  • Caffe:由伯克利视觉和学习中心(BVLC)开发的深度学习框架,OpenCV 可以加载 Caffe 训练的模型(.prototxt 用于定义网络结构,.caffemodel 存储训练好的权重)。
  • TensorFlow:谷歌开发的开源深度学习框架,OpenCV 支持加载 TensorFlow 的冻结图模型(.pb 文件)。
  • PyTorch:Facebook 开发的深度学习框架,OpenCV 可以加载经过 ONNX(开放神经网络交换格式)转换后的 PyTorch 模型(.onnx 文件)。
  • Darknet:YOLO(You Only Look Once)目标检测算法所使用的深度学习框架,OpenCV 能加载 Darknet 训练的模型(.cfg 定义网络结构,.weights 存储权重)。

主要功能

  • 图像分类:可以使用预训练的分类模型(如 ResNet、VGG 等)对输入图像进行分类,判断图像所属的类别。
  • 目标检测:支持多种目标检测模型(如 YOLO、SSD 等),能够在图像或视频中检测出特定目标的位置和类别。
  • 语义分割:利用语义分割模型(如 U-Net、DeepLab 等)将图像中的每个像素划分到不同的类别,实现对图像的精细化分析。
  • 特征提取:从输入数据中提取高级特征,这些特征可用于后续的机器学习任务,如目标识别、图像检索等。

实例风格迁移

通过torch训练好的模型进行对图片的处理。
模型如下:通过网盘分享的文件:model.zip
链接: https://pan.baidu.com/s/1EjVsi3WIGcOm8Gk28xiMWA 提取码: x2m3
文件模型可以自由挑选
本文使用图片:
在这里插入图片描述

代码:

import cv2

# 读取指定路径下的图片文件 'nezha.jpg',将其存储为一个多维数组(表示图像)
# 该数组包含了图像的像素信息,后续可以对这些像素进行各种操作
image = cv2.imread('nezha.jpg')

# 使用 cv2.imshow 函数显示原始图像
# 第一个参数 'yuan tu' 是显示窗口的标题,第二个参数 image 是要显示的图像
cv2.imshow('yuan tu', image)

# cv2.waitKey(0) 用于等待用户按下任意按键
# 参数 0 表示无限等待,直到用户按下按键才会继续执行后续代码
cv2.waitKey(0)

'''图片预处理'''
# 获取图像的高度和宽度
# image.shape 返回一个元组,包含图像的高度、宽度和通道数
# [:2] 表示取元组的前两个元素,即高度和宽度
(h, w) = image.shape[:2]

# 使用 cv2.dnn.blobFromImage 函数对图像进行预处理,将其转换为适合神经网络输入的格式
# 第一个参数 image 是要处理的图像
# 第二个参数 1 是缩放因子,这里不进行缩放
# 第三个参数 (w, h) 是输出图像的尺寸,这里保持原图像的尺寸
# 第四个参数 (0, 0, 0) 是每个通道的均值,这里将每个通道的均值设为 0
# swapRB=False 表示不交换颜色通道(在 OpenCV 中,图像默认是 BGR 格式)
# crop=False 表示不进行裁剪操作
blob = cv2.dnn.blobFromImage(image, 1, (w, h), (0, 0, 0), swapRB=False, crop=False)

'''加载模型'''
# 使用 cv2.dnn.readNet 函数加载预训练的神经网络模型
# r'model\starry_night.t7' 是模型文件的路径,r 表示原始字符串,避免反斜杠被转义
net = cv2.dnn.readNet(r'model\starry_night.t7')

# 将预处理后的图像数据 blob 输入到神经网络中
net.setInput(blob)

# 调用 net.forward() 函数进行前向传播计算
# 即让图像数据通过神经网络,得到输出结果
out = net.forward()

# 调整输出结果的形状
# out.shape 返回输出结果的维度信息,通过 reshape 函数将其重新调整为 (out.shape[1], out.shape[2], out.shape[3]) 的形状
out_new = out.reshape(out.shape[1], out.shape[2], out.shape[3])

# 对调整形状后的输出结果进行归一化处理
# cv2.normalize 函数用于将数组中的元素值归一化到指定的范围
# 第一个参数 out_new 是要进行归一化处理的数组
# 第二个参数 out_new 是输出数组,这里表示将归一化后的结果存储在原数组中
# norm_type=cv2.NORM_MINMAX 表示使用最小 - 最大归一化方法,将数组中的元素值缩放到 [0, 1] 范围内
cv2.normalize(out_new, out_new, norm_type=cv2.NORM_MINMAX)

# 对归一化后的结果进行维度转换
# transpose(1, 2, 0) 表示将数组的维度按照指定的顺序进行重新排列
# 这样可以将数据转换为适合 OpenCV 显示的格式
result = out_new.transpose(1, 2, 0)

# 使用 cv2.imshow 函数显示经过风格转换后的图像
# 'Stylized Image' 是显示窗口的标题,result 是要显示的图像
cv2.imshow('Stylized Image', result)

# 再次等待用户按下任意按键
cv2.waitKey(0)

# 关闭所有由 OpenCV 创建的窗口,释放相关资源
cv2.destroyAllWindows()

结果:
在这里插入图片描述

也可以对视频进行风格迁移,一下是摄像头拍摄的风格迁移

import cv2
cap = cv2.VideoCapture(0)
net = cv2.dnn.readNetFromTorch(r'D:\where-python\python-venv\shi_jue_demo\DNN\model\starry_night.t7')
if not cap.isOpened():
    print('摄像头启动失败')
    exit()
while True:
    ret,frame = cap.read()
    if not ret:
        print('不能读取摄像头')
        break
    (h,w) = frame.shape[:2]
    blob = cv2.dnn.blobFromImage(frame,1,(w,h),(0,0,0),swapRB=True,crop=False)
    net.setInput(blob)
    out = net.forward()
    out_new = out.reshape(out.shape[1],out.shape[2],out.shape[3])
    cv2.normalize(out_new,out_new,norm_type=cv2.NORM_MINMAX)
    result = out_new.transpose(1,2,0)
    cv2.imshow('result',result)
    key_pressed = cv2.waitKey(10)
    if key_pressed ==27:
        break
cap.release()
cv2.destroyAllWindows()
### 使用 OpenCV DNN 模块实现图像识别 #### 导入必要的模块 为了使用OpenCVDNN模块进行图像识别,需要先导入`cv2.dnn`以及其他辅助功能模块。这些模块提供了加载深度学习模型以及处理输入输出数据的能力。 ```python import cv2 ``` #### 加载预训练模型 选择合适的预训练模型对于特定的任务非常重要。例如,在人脸识别任务中可以选择基于Caffe的人脸检测模型[^3]: ```python net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'res10_300x300_ssd_iter_140000.caffemodel') ``` 如果要执行更复杂的物体检测,则可能需要用到YOLO或其他类型的模型文件。下面展示了一个简单的例子,其中包含了读取YOLOR模型的过程[^4]: ```python modelConfiguration = "yolor_p6.cfg" modelWeights = "yolor_p6.weights" net = cv2.dnn.readNet(modelConfiguration, modelWeights) ``` #### 设置输入并获取预测结果 准备好模型之后,下一步就是准备待测图片作为网络的输入,并设置合理的参数以获得最佳性能。通常情况下会将原始图片转换为适合神经网络接受的形式——blob形式。 ```python image = cv2.imread('example.jpg') # 替换为你自己的图片路径 height, width = image.shape[:2] # 创建一个blob对象,这一步骤包括减均值、比例缩放、裁剪、交换通道等操作 blob = cv2.dnn.blobFromImage(image, scalefactor=1 / 255.0, size=(640, 640), swapRB=True) # 将blob传递给网络 net.setInput(blob) # 获取所有层名称及其索引号 layer_names = net.getLayerNames() output_layers_indices = [i[0] - 1 for i in net.getUnconnectedOutLayers()] outputs = net.forward([layer_names[i] for i in output_layers_indices]) ``` #### 解析输出结果 最后一步是从网络得到的结果中提取有用的信息。不同的模型会有不一样的输出结构;比如SSD类的目标检测器可能会返回边界框坐标、类别标签和置信度分数等等。解析这部分内容时应当参照所使用的具体模型文档说明来进行。 ```python for detection in outputs: scores = detection[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5: # 只保留高于阈值的概率 center_x = int(detection[0] * width) center_y = int(detection[1] * height) w = int(detection[2] * width) h = int(detection[3] * height) x = int(center_x - w / 2) y = int(center_y - h / 2) color = (0, 255, 0) # 绘制矩形的颜色 thickness = 2 # 边界厚度 cv2.rectangle(image, (x,y), (x+w,y+h), color, thickness) label = f'{class_name} {confidence:.2f}' cv2.putText(image, label, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, thickness) ``` 以上代码片段展示了如何利用OpenCV中的DNN模块完成基本的对象检测流程。当然实际应用中还需要考虑更多细节问题,如多尺度测试、非极大抑制(NMS)过滤重叠框等优化措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回顶部