智慧交通day01-算法库03:cv.dnn

1.DNN模块

1.1. 模块简介

OpenCV中的深度学习模块(DNN)只提供了推理功能,不涉及模型的训练,支持多种深度学习框架,比如TensorFlow,Caffe,Torch和Darknet。

 OpenCV那为什么要实现深度学习模块?

  • 轻量型。DNN模块只实现了推理功能,代码量及编译运行开销远小于其他深度学习模型框架。

  • 使用方便。DNN模块提供了内建的CPU和GPU加速,无需依赖第三方库,若项目中之前使用了OpenCV,那么通过DNN模块可以很方便的为原项目添加深度学习的能力。

  • 通用性。DNN模块支持多种网络模型格式,用户无需额外的进行网络模型的转换就可以直接使用,支持的网络结构涵盖了常用的目标分类,目标检测和图像分割的类别,如下图所示:

 DNN模块支持多种类型网络层,基本涵盖常见的网络运算需求。

 也支持多种运算设备(CPU,GPU等)和操作系统(Linux,windows,MacOS等)。

1.2.模块架构

DNN模块的架构如下图所示: 

 从上往下依次是:

  • 第一层:语言绑定层,主要支持Python和Java,还包括准确度测试、性能测试和部分示例程序。
  • 第二层:C++的API层,是原生的API,功能主要包括加载网络模型、推理运算以及获取网络的输出等。
  • 第三层:实现层,包括模型转换器、DNN引擎以及层实现等。模型转换器将各种网络模型格式转换为DNN模块的内部表示,DNN引擎负责内部网络的组织和优化,层实现指各种层运算的实现过程。
  • 第四层:加速层,包括CPU加速、GPU加速、Halide加速和Intel推理引擎加速。CPU加速用到了SSE和AVX指令以及大量的多线程元语,而OpenCL加速是针对GPU进行并行运算的加速。Halide是一个实验性的实现,并且性能一般。Intel推理引擎加速需要安装OpenVINO库,它可以实现在CPU、GPU和VPU上的加速,在GPU上内部会调用clDNN库来做GPU上的加速,在CPU上内部会调用MKL-DNN来做CPU加速,而Movidius主要是在VPU上使用的专用库来进行加速。

除了上述的加速方法外,DNN模块还有网络层面的优化。这种优化优化分两类,一类是层融合,还有一类是内存复用。

  • 层融合

    层融合通过对网络结构的分析,把多个层合并到一起,从而降低网络复杂度和减少运算量。

如上图所示,卷积层后面的BatchNorm层、Scale层和RelU层都被合并到了卷积层当中。这样一来,四个层运算最终变成了一个层运算。

 如上图所示,网络结构将卷积层1和Eltwise Layer和RelU Layer合并成一个卷积层,将卷积层2作为第一个卷积层新增的一个输入。这样一来,原先的四个网络层变成了两个网络层运算。

 如上图所示,原始的网络结构把三个层的输出通过连接层连接之后输入到后续层,这种情况可以把中间的连接层直接去掉,将三个网络层输出直接接到第四层的输入上面,这种网络结构多出现SSD类型的网络架构当中。

  • 内存复用
    深度神经网络运算过程当中会占用非常大量的内存资源,一部分是用来存储权重值,另一部分是用来存储中间层的运算结果。我们考虑到网络运算是一层一层按顺序进行的,因此后面的层可以复用前面的层分配的内存。
    下图是一个没有经过优化的内存重用的运行时的存储结构,红色块代表的是分配出来的内存,绿色块代表的是一个引用内存,蓝色箭头代表的是引用方向。数据流是自下而上流动的,层的计算顺序也是自下而上进行运算。每一层都会分配自己的输出内存,这个输出被后续层引用为输入。

对内存复用也有两种方法:

第一种内存复用的方法是输入内存复用。

 如上图所示,如果我们的层运算是一个in-place模式,那么我们无须为输出分配内存,直接把输出结果写到输入的内存当中即可。in-place模式指的是运算结果可以直接写回到输入而不影响其他位置的运算,如每个像素点做一次Scale的运算。类似于in-place模式的情况,就可以使用输入内存复用的方式。

第二种内存复用的方法是后续层复用前面层的输出。

 如上图所示,在这个例子中,Layer3在运算时,Layer1和Layer2已经完成了运算。此时,Layer1的输出内存已经空闲下来,因此,Layer3不需要再分配自己的内存,直接引用Layer1的输出内存即可。由于深度神经网络的层数可以非常多,这种复用情景会大量的出现,使用这种复用方式之后,网络运算的内存占用量会下降30%~70%。

2.常用方法简介

DNN模块有很多可直接调用的Python API接口,现将其介绍如下:

2.1.dnn.blobFromImage

作用:根据输入图像,创建维度N(图片的个数),通道数C,高H和宽W次序的blobs

原型:

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 pltimg_cv2 = cv2.imread("test.jpeg")
print("原图像大小: ", img_cv2.shape)inWidth = 256
inHeight = 256
outBlob1 = cv2.dnn.blobFromImage(img_cv2,scalefactor=1.0 / 255,size=(inWidth, inHeight),mean=(0, 0, 0),swapRB=False,crop=False)
print("未裁剪输出: ", outBlob1.shape)
outimg1 = np.transpose(outBlob1[0], (1, 2, 0))outBlob2 = cv2.dnn.blobFromImage(img_cv2,scalefactor=1.0 / 255,size=(inWidth, inHeight),mean=(0, 0, 0),swapRB=False,crop=True)
print("裁剪输出: ", outBlob2.shape)
outimg2 = np.transpose(outBlob2[0], (1, 2, 0))plt.figure(figsize=[10, 10])
plt.subplot(1, 3, 1)
plt.title('输入图像', fontsize=16)
plt.imshow(cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB))
plt.axis("off")
plt.subplot(1, 3, 2)
plt.title('输出图像 - 未裁剪', fontsize=16)
plt.imshow(cv2.cvtColor(outimg1, cv2.COLOR_BGR2RGB))
plt.axis("off")
plt.subplot(1, 3, 3)
plt.title('输出图像 - 裁剪', fontsize=16)
plt.imshow(cv2.cvtColor(outimg2, cv2.COLOR_BGR2RGB))
plt.axis("off")
plt.show()

输出结果为:

 另外一个API与上述API类似,是进行批量图片处理的,其原型如下所示:

blobFromImages(images, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None):

作用:批量处理图片,创建4维的blob,其它参数类似于 dnn.blobFromImage

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

作用:加载深度学习网络及其模型参数

原型:

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: 所支持格式的框架名

该函数自动检测训练模型所采用的深度框架,然后调用 readNetFromCaffereadNetFromTensorflowreadNetFromTorch 或 readNetFromDarknet 中的某个函数完成深度学习网络模型及模型参数的加载。

下面我们看下对应于特定框架的API:

  1. Caffe
readNetFromCaffe(prototxt, caffeModel=None)
作用:加载采用Caffe的配置网络和训练的权重参数
  1. Darknet

    readNetFromDarknet(cfgFile, darknetModel=None)
    

    作用:加载采用Darknet的配置网络和训练的权重参数

  2. Tensorflow

    readNetFromTensorflow(model, config=None)
    

    作用:加载采用Tensorflow 的配置网络和训练的权重参数

    参数:

    • model: .pb 文件
    • config: .pbtxt 文件
  3. Torch

    readNetFromTorch(model, isBinary=None)
    

    作用:加载采用 Torch 的配置网络和训练的权重参数

    参数:

    • model: 采用 torch.save()函数保存的文件
  4. ONNX

    readNetFromONNX(onnxFile)

    作用:加载 .onnx 模型网络配置参数和权重参数


总结

  1. DNN模块是OPenCV中的深度学习模块

    优势:轻量型,方便,通用性

    架构:语言绑定层,API层,实现层,加速层

    加速方法:层融合、内存复用

  2. 常用API

    • dnn.blobfromImage

      利用图片创建输入到模型中的blobs

    • dnn.NMSBoxes

      根据boxes和scores进行非极大值抑制

    • dnn.readNet

      加载网络模型和训练好的权重参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高标清硬盘播出服务器,高标清4通道SDI硬盘播出服务器 XUAPX4000HD

原标题:高标清4通道SDI硬盘播出服务器 XUAPX4000HDXUAP多通道硬盘自动播出系全系统设计 IP/TS/SDI多种播出模式XUAP系统采用先进硬件译码技术的自动播出系统,可依设定时间自动化切换影片与触发连动外围设备,如 矩阵、录像机、切换器 等&#…

行为科学统计第3章

行为科学统计 Statistics for the Behavioral Sciences 人生很累,现在不累,以后更累啦~ 第3章 集中趋势 引言:一个平均数最主要的优势是它提供了单个数字,这个数字可以描述整个分布,并且可以被用于与其他分…

linux驱动层获取当前的系统时间

#include <linux/timer.h> #include <linux/timex.h> #include <linux/rtc.h>/*添加到合适位置*/struct timex txc; struct rtc_time tm;do_gettimeofday(&(txc.time));rtc_time_to_tm(txc.time.tv_sec,&tm);printk("UTC time :%d-%d-%d %d:%d…

智慧交通day02-车流量检测实现01:总览

随着城市交通量的迅猛增加&#xff0c;车流量统计已成为智能交通系统中一项关键技术和热门研究方向。高效而精确的车流量检测可以交通管理者和决策者&#xff0c;以及驾驶员提供数据支撑&#xff0c;从而为交通调度&#xff0c;降低拥堵情况的发生&#xff0c;提高道路利用率有…

从qq服务器删除误收邮件,如何恢复从qq邮箱删除的电子邮件

Qq邮箱恢复意外删除的邮件方法第1步: 如果您删除邮件&#xff0c;则无论是普通删除还是完整删除&#xff0c;都可以选择在几秒钟内撤消&#xff0c;以便恢复以前意外删除的邮件. 也就是说&#xff0c;在删除消息后&#xff0c;请在删除上述提示后单击“撤消”. 如果提示消息消失…

linux-虚拟机安装

第一步&#xff1a;下载 安装虚拟机&#xff01; 链接: http://pan.baidu.com/s/1nuGLwsL 密码: 2qdy 第二步&#xff1a;镜像文件&#xff01; 链接: http://pan.baidu.com/s/1nuGLwsL 密码: 2qdy linux 命令大全&#xff1a; arch 显示机器的处理器架构(1) uname -m 显示机器…

安卓JNI传结构体

安卓层代码: package com.demouhf.uhfjni;import android.util.Log; class Foo {protected int len;protected String name; } public class Demouhf {static {try {Log.i("JNI", "wqf Trying to load libnhf.so");/* 調用gsensor.so */System.loadLibra…

智慧交通day02-车流量检测实现02:多目标追踪

1.多目标跟踪分类 多目标跟踪&#xff0c;即MOT&#xff08;Multi-Object Tracking&#xff09;&#xff0c;也就是在一段视频中同时跟踪多个目标。MOT主要应用在安防监控和自动驾驶等领域中。 1.1 初始化方法 多目标跟踪&#xff0c;即MOT&#xff08;Multi-Object Trackin…

GIT非常好的整理

初始化配置 C代码 #配置使用git仓库的人员姓名 git config --global user.name "Your Name Comes Here" #配置使用git仓库的人员email git config --global user.email youyourdomain.example.com #配置到缓存 默认15分钟 git config --global cred…

centos虚拟机wifi设置代理服务器,vmware虚拟机centos在宿主机连WIF..._网络编辑_帮考网...

caotongjiang新兵答主12-13TA获得超过6747个赞资料:netmask ip地址 broadcast 子网掩码 gateway 网关 dns DNS服务器vmware三种网络连接上网设置&#xff1a;1.桥接方式(bridge) :默认使用vmnet0将虚拟机的ip设置与主机同网段未使用ip,其余与主机相同:ip地址与主机同段相异,子网…

PHP mysql_real_escape_string() 函数

mysql_real_escape_string (PHP 4 > 4.3.0, PHP 5) mysql_real_escape_string — 转义 SQL 语句中使用的字符串中的特殊字符&#xff0c;并考虑到连接的当前字符集 Warning 本扩展自 PHP 5.5.0 起已废弃&#xff0c;并在将来会被移除。应使用 MySQLi 或 PDO_MySQL 扩展来替换…

ValueError: check_hostname requires server_hostname的解决办法

在用pip安装scikit-image库时报错&#xff1a;ValueError: check_hostname requires server_hostname 报错ValueError: check_hostname requires server_hostname通常是因为版本冲突等原因&#xff0c;查遍网上众多大佬总结的经验后&#xff0c;最终发现是由网络代理导致的问题…

微软笔试题(看到的写答案啊)

int func(int n, int* r) {printf("n%d *r%d\n",n,*r);//加了个打印的东西 return n && (*r n) && func(n-1, r); }int main() {int r 0;func(100, &r);return 0; }&&还具有短路的功能&#xff0c;即如果第一个表达式为false&#xff…

salesforce 零基础学习(五十四)常见异常友好消息提示

异常或者error code汇总&#xff1a;https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_concepts_core_data_objects.htm 做项目的时候有很多异常是我们经常遇到的&#xff1a; 1.空指针异常&#xff1b; 2.死锁或者超时&#xff1b; 3.级联删…

datasnap ajax jsonp,有没有办法在Delphi DataSnap REST服务器上使用JSONP?

似乎没有办法使用DataSnap来实现带有Padding的JSONP(JSON)解决方案&#xff0c;但是我想在这里抛出这个问题以防有人解决了这个问题。有没有办法在Delphi DataSnap REST服务器上使用JSONP&#xff1f;背景&#xff1a;JSONP是一种利用HTML脚本元素的跨站点引用功能来克服XmlHtt…

PackagesNotFoundError: The following packages are not available from current channels:

解决方法很简单。 先输入以下命令&#xff1a; conda config --append channels conda-forge 在安装你所需要的包即可。

redis安装与基本配置

获取下载包 wget http://download.redis.io/releases/redis-2.8.24.tar.gz 解压和编译 tar -zxvf redis-2.8.24.tar.gz cd redis-2.8.24/ make #如果报jemalloc的错&#xff0c;就用make MALLOClibc make test make test可能报错说需要tcl 8.5&#xff0c;用yum安装 yum ins…

★Anaconda中创建、切换、删除虚拟环境(指定仓库)

指定仓库安装源文件 pip install 包名 -i http://pypi.douban.com/simple 可以换源列表&#xff1a; 阿里云 https://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ #常用 豆瓣(douban) http://pypi.douban.com/simple/ 清华…

怎样修改t3服务器地址,怎样修改t3服务器地址

怎样修改t3服务器地址 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。Atlas 200 DK开发者板支持通过USB端口或者网线与Ubuntu服务器…

结构体中.和-的用法

#include"stdio.h" #include"stdlib.h"struct linkwqf{int age;char * name;struct linkwqf* next; }; struct linkwqf linkwww1;/*第一种声明结构体类型变量的方法 这种方法意义不大*/ typedef struct linkwqf linkwww2;/*第一种声明结构体类型变量的方…