1.1. DNN模块简介
OpenCV中的深度学习模块(DNN)只提供了推理功能,不涉及模型的训练,支持多种深度学习框架,比如TensorFlow,Caffe,Torch和Darknet。
OpenCV为什么要实现深度学习模块?
-
轻量型。DNN模块只实现了推理功能,代码量及编译运行开销远小于其他深度学习模型框架。
-
使用方便。DNN模块提供了内建的CPU和GPU加速,无需依赖第三方库,若项目中之前使用了OpenCV,那么通过DNN模块可以很方便的为原项目添加深度学习的能力。
-
通用性。DNN模块支持多种网络模型格式,用户无需额外的进行网络模型的转换就可以直接使用,支持的网络结构涵盖了常用的目标分类,目标检测和图像分割的类别,如下图所示:
DNN模块支持多种类型网络层,基本涵盖常见的网络运算需求。
2.常用方法简介
2.1.dnn.blobFromImage
blobFromImage(img,
scalefactor=None,
size=None,
mean=None,
swapRB=None,
crop=None,
ddepth=None):
参数:
- image:cv2.imread 读取的图片数据
- scalefactor: 缩放像素值,假设scalefactor=1/255, mean=None, 则表示将像素值归一化到区间[0,1]内,即img = img * scalefactor
- size: 输出blob(图像)的尺寸,如 (netInWidth, netInHeight)
- mean: 从各通道减均值。例子:当 mean=(10,20,30),img =( cv2.merge( img[: ,: ,0] -10,img[:, :, 1] - 20, img[:, :, 2] - 30) ) * scalefactor
- swapRB: 交换 3 通道图片的第一个和最后一个通道,如 BGR - RGB
- crop: 图像尺寸 resize 后是否裁剪. 如果
crop=True
,则,输入图片的尺寸调整resize后,一个边对应与 size 的一个维度,而另一个边的值大于等于 size 的另一个维度;然后从 resize 后的图片中心进行 crop. 如果crop=False
,则无需 crop,只需保持图片的长宽比 - ddepth: 输出 blob 的 Depth. 可选: CV_32F 或 CV_8U
2.2.dnn.NMSBoxes
作用:根据给定的检测boxes和对应的scores进行NMS(非极大值抑制)处理
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.3. dnn.readNet
作用:加载深度学习网络及其模型参数
DNN 加速
net.setPreferableBackend(DNN_BACKEND_OPENCV);
net.setPreferableTarget(DNN_TARGET_OPENCL);
第一个设置,假如设置DEFAULT,默认设置的话,必须设置一个环境变量,并且变量的路径要是磁盘上一个文件夹,文件夹要存在,否则会警告或者报错。假如设置成OPENCV,会在用户名一个临时文件夹生成一些OPENCL的文件。建议设置为OPENCV,不用去配置环境变量
第二个设置,假如设置为CPU的话,速度较慢,通用性较好。设置为OPENCL的话,只能运行在inter的GPU上。假如电脑上有NVIDIA的话,会一直卡住,目前还没找到设置OPENCV运行哪块GPU的方法,没有在NVIDIA上的电脑上运行过。所以,为了确保GPU加速,不要在有NVIDIA电脑上运行
采用OPENCL运行加速,SSD项目测试,CPU每帧90ms,OPENCL每帧只要45ms左右,OPENCL_FP16只要30ms左右,实时性还是不错的