OpenCV加载深度学习框架与模型
OpenCV加载深度学习框架与模型
1.DNN模块
OPenCV⾃3.3版本开始,加⼊了对深度学习⽹络的⽀持,即DNN模块,它⽀持主流的深度学习框架⽣成与到处模型的加载。
模块简介
OpenCV的深度学习模块DNN,只提供预测的功能,不能使⽤DNN进⾏模型训练,但是它⽀持多种深度学习框架,⽐如说
TensorFlow,Caffe,Torch和Darknet。
DNN的优点:
轻量级:DNN只实现模型预测,推理的功能,代码量和编译运⾏开销时间⼩于其他深度学习模型框架
使⽤⽅便:⽆需其他依赖第三⽅库,只需要下载好对应不同深度学习框架下已经训练好的模型,或者是
模型的配置⽂件,模型参数通⽤性:DNN⽀持⽹络结构涵盖多种计算机视觉应⽤,⽬标分类,⽬标检测和图像分割的类别
2.DNN模块常⽤函数⽅法
与常见的计算机视觉应⽤⼀样,再将数据加⼊到模型之前,需要对数据进⾏tranform
2.1 cv2.dnn.blobFromImage
blobFromImage(image,
scalefactor=None,
size=None,
mean=None,
swapRB=None,
crop=None,
ddepth=None):
image:cv2.imread 读取的图⽚数据
scalefactor:缩放像素值,如 [0, 255] - [0, 1]
size:输出blob(图像)的尺⼨,如 (netInWidth, netInHeight)
mean:从各通道减均值. 如果输⼊ image 为 BGR 次序,且swapRB=True,则通道次序为 (mean-R, mean-G, mean-B).
swapRB:交换 3 通道图⽚的第⼀个和最后⼀个通道,如 BGR - RGB
crop:图像尺⼨ resize 后是否裁剪. 如果crop=True,则,输⼊图⽚的尺⼨调整resize后,⼀个边对应与 size 的⼀个维度,⽽另⼀个边的值⼤于等于 size 的另⼀个维度;然后从 resize 后的图⽚中⼼进⾏ crop. 如果crop=False,则⽆需 crop,只需保持图⽚的长宽⽐ddepth:输出 blob 的 Depth. 可选: CV_32F 或 CV_8U
import cv2
from cv2 import dnn
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("data/8.jpg")
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
inWidth =256
inHeight =256
outimg1 = cv2.dnn.blobFromImage(img,
scalefactor=1.0/255,
size=(inWidth, inHeight),
mean=(0,0,0),
swapRB=False,
crop=False)
outimg1 = np.transpose(outimg1[0],(1,2,0))
outimg2 = cv2.dnn.blobFromImage(img,
scalefactor=1.0/255,
size=(inWidth, inHeight),
mean=(0,0,0),
swapRB=False,
crop=True)
outimg2 = np.transpose(outimg2[0],(1,2,0))
imgs=[img,outimg1,outimg2]
fig=plt.figure(figsize=[10,10])
titles =['origin','nocrop','crop']
for i in range(3):
ax=fig.add_subplot(1,3,i+1)
ax.axis("off")
plt.title(titles[i])
ax.imshow(imgs[i])
还有⼀种批量的cv2.dnn.blobFromImages(),参数是⼀样的
2.3 cv2.dnn.NMSBoxes
根据给定的检测boxes和对应的scores进⾏NMS(⾮极⼤值抑制)处理。
NMS原理:我们在做⽬标检测类似应⽤时,⽬标检测算法会给图⽚上所有物体产⽣很多的候选框,但这些候选框可能有些会互相重叠,NMS作⽤就是只保留最优的框。我们⽬标检测每个框都会有⼀个置信度分数S。
NMS流程步骤:
1. 将所有候选框看成⼀个集合A,再创建⼀个存放最优框的集合B,初始化为空集
2. 对集合A,进⾏框排序,选出置信度分数最⾼的框m,将m加⼊到集合B中
3. 遍历剩下集合A,分别与框m计算交并⽐,如果⾼于某⼀个阈值(我们需要设定⼀个阈值),则认为此框与m重叠,将此框从集合A中
去除
4. 重复第2,3步,直到集合A为空,集合B中的框就是我们所需的
NMSBoxes(bboxes,
scores,
score_threshold,
nms_threshold,
eta=None,
top_k=None)
boxes:待处理的边界框 bounding boxes
scores:对于于待处理边界框的 scores
score_threshold:⽤于过滤 boxes 的 score 阈值
nms_threshold:NMS ⽤到的阈值
indices:NMS 处理后所保留的边界框的索引值
eta:⾃适应阈值公式中的相关系数:
top_k:如果 top_k>0,则保留最多 top_k 个边界框索引值
2.4 adNet
作⽤:加载深度学习⽹络及其模型参数
原型:
readNet(model, config=None, framework=None)
参数:
model:训练的权重参数的模型⼆值⽂件,⽀持的格式有:caffemodel(Caffe)、pb(TensorFlow)、t7 或net(Torch)、
weights(Darknet)、bin(DLDT)
config:包含⽹络配置的⽂本⽂件,⽀持的格式有:.prototxt (Caffe)、pbtxt (TensorFlow)、cfg(Darknet)、.xml (DLDT).
framework: 所⽀持格式的框架名 该函数⾃动检测训练模型所采⽤的深度框架,然后调⽤readNetFromCaffe、
readNetFromTensorflow、readNetFromTorch 或readNetFromDarknet 中的某个函数完成深度学习⽹络模型及模型参数的加载。
对应于特定框架的API:
2.4.1 adNetFromCaffe
readNetFromCaffe(prototxt, caffeModel=None)
作⽤:加载采⽤Caffe的配置⽹络和训练的权重参数
2.4.2 adNetFromDarknet
readNetFromDarknet(cfgFile, darknetModel=None)
作⽤:加载采⽤Darknet的配置⽹络和训练的权重参数
2.4.3 adNetFromTensorflow
readNetFromTensorflow(model, config=None)
作⽤:加载采⽤Tensorflow 的配置⽹络和训练的权重参数
参数:
model: .pb ⽂件
config: .pbtxt ⽂件
2.4.4 adNetFromTorch
作⽤:加载采⽤ Torch 的配置⽹络和训练的权重参数
参数:model: 采⽤ torch.save()函数保存的⽂件
3.OpenCV使⽤预训练模型做应⽤
步骤:
1. 加载模型
2. 图像预处理
3. 模型推理
3.1 加载模型
⽬前主流的框架为pytorch
这⾥就只详细说明⼀下,加载pytorch和Darknet所⽤的配置⽂件吧
3.1.1 pytorch
在pytorch中有三种保存模型⽅式:
经常会看到后缀名为.pt, .pth, .pkl的pytorch模型⽂件,其实它们并不是在格式上有区别,只是后缀不同⽽已(仅此⽽已),在⽤
torch.save()函数保存模型⽂件时,各⼈有不同的喜好,有些⼈喜欢⽤.pt后缀,有些⼈喜欢⽤.pth或.pkl.⽤相同的torch.save()语句保存出来的模型⽂件没有什么不同。
注意模型⽂件的格式
#1
torch.save(model,'model.pt')
#2
torch.save(model.state_dict(),'model.pt')
在adNetFromTorch,我们加载的是后者,即模型的参数。
3.1.2 Darknet
darknet框架是针对yolo模型的,以yolov3做coco⽬标检测模型为例。rectangle函数opencv
Darknet模型有这样⼏个⽂件:
yolov3.weights
yolov3.cfg
coco.names
DNN加载模型
model = adNetFromDarknet('yolov3.cfg','yolov3.weights')
3.1.3 python代码
# detect.py
import cv2
import numpy as np
import os
import time
def yolo_detect(pathIn='',
pathOut=None,
label_path='./cfg/coco.names',
config_path='./cfg/yolov3.cfg',
weights_path='./cfg/yolov3.weights',
confidence_thre=0.5,
nms_thre=0.3,
jpg_quality=80):
'''
pathIn:原始图⽚的路径
pathOut:结果图⽚的路径
label_path:类别标签⽂件的路径
config_path:模型配置⽂件的路径
weights_path:模型权重⽂件的路径
confidence_thre:0-1,置信度(概率/打分)阈值,即保留概率⼤于这个值的边界框,默认为0.5    nms_thre:⾮极⼤值抑制的阈值,默认为0.3
jpg_quality:设定输出图⽚的质量,范围为0到100,默认为80,越⼤质量越好
'''
# 加载类别标签⽂件
LABELS =open(label_path).read().strip().split("\n")
nclass =len(LABELS)
# 为每个类别的边界框随机匹配相应颜⾊
np.random.seed(42)
COLORS = np.random.randint(0,255, size=(nclass,3), dtype='uint8')
# 载⼊图⽚并获取其维度
base_path = os.path.basename(pathIn)
img = cv2.imread(pathIn)
(H, W)= img.shape[:2]
# 加载模型配置和权重⽂件
print('从硬盘加载')
net = adNetFromDarknet(config_path, weights_path)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。