OpenCV实例(九)基于深度学习的运动目标检测(一)YOLO运动目标检测算法

基于深度学习的运动目标检测(一)

  • 1.YOLO算法检测流程
  • 2.YOLO算法网络架构
  • 3.网络训练模型
    • 3.1 训练策略
    • 3.2 代价函数的设定

2012年,随着深度学习技术的不断突破,开始兴起基于深度学习的目标检测算法的研究浪潮。

2014年,Girshick等人首次采用深度神经网络实现目标检测,设计出R-CNN网络结构,实验结果表明,在检测任务中性能比DPM算法优越。同时,何恺明等人针对卷积神经网络(Convolutional Neural Network,CNN)计算复杂度高的问题,引入空间金字塔池化层,设计出基于SPP-Net的目标检测网络,不但提高了目标检测速度,而且支持任意尺寸大小的图像输入。

2015年,Girshick在R-CNN目标检测网络的基础上针对候选框特征重复提取进行优化,提出了Fast R-CNN(Fast Regions with CNN,Fast R-CNN)网络结构,实现了端对端式的训练,并且所有网络层的参数在不断更新。任少卿和何恺明等人采用区域建议网络(Region Proposal Network,RPN)和Fast R-CNN网络结合的方式,设计出新的目标检测网络,该网络使得目标检测精度和速度得到很大的提升。

传统的目标检测算法的基本思路一般都是先对图像进行预处理,然后使用滑动窗口策略在整个图像均匀间隔的区域上提取特征,最后利用机器学习中的分类器判断是否存在目标,比如之前的DMP系统不但检测流程复杂,而且检测过程中卷积计算量较大,无法满足现实生活中检测的实时性。对于该算法的不足,Joseph Redmon等人提出了YOLO算法,主要利用的是将目标检测任务的问题转换为回归问题,其设计的网络只要进行一次计算,就能直接得到完整图像中目标的边界框和类别概率。同时,该网络结构单一,实现端对端式的训练。因此,YOLO检测算法的检测速度可满足实际的检测需求。下面我们从检测流程、网络架构、网络训练模型3个角度来分析YOLO算法。

基于YOLO算法的目标检测流程大致可分为3个步骤:

(1)把待检测的图像调整大小为448×448。

(2)将图像放到CNN输出待检测目标边界框的坐标信息和类别概率。

(3)使用非极大抑制算法去除冗余的标注框,筛选出最终的目标检测结果。

在这里插入图片描述

1.YOLO算法检测流程

YOLO算法的整体检测思路为:首先将待检测图像划分为S×S个网格,然后对每个网格都预测B个边界框(bounding boxes)和这些边界框所对应的自信得分(confidence scores)。YOLO算法具体的检测示意图如图所示。

在这里插入图片描述

此时,若有目标的中心点落在某个格子单元中,则该格子将负责检测这个目标,而confidence score负责检测该网络模型的单元格中是否有目标,以及对预测位置的精确度。当单元格中没有目标时,confidence score为0,如果存在目标,则为预测的boxes与真实的boxes之间的IoU值。
在这里插入图片描述

每个边界框都包含了5个预测值:x,y,w,h,confidence。其中,坐标(x,y)代表边界框的中心坐标,与网格单元对齐(相当于当前网格单元的偏移值),使得范围变成[0,1];坐标(w,h)代表预测的边框相对于整个图像的高度和宽度的比例。每个网格还要预测一个类别信息,记为C类,则C个类别条件概率值为Pr( | )。在测试阶段,每个边界框的具体类别的自信得分计算公式如下:

在这里插入图片描述

上式得到的结果中既包含了边界框中预测类别的概率信息,也反映了边界框中是否含有目标和边界框位置的精确度。

2.YOLO算法网络架构

通过上述分析YOLO的检测流程可以看出,YOLO算法将格子数S设置为7×7的大小,网络方面采用GooleNet的思想,其中包含了24个卷积层和2个全连接层,如图所示。卷积层主要用来提取特征,全连接层主要用来预测类别概率和坐标,与GooleNet的不同之处在于YOLO检测网络没有采用Inception结构,而采用1×1和3×3的卷积层代替了Inception。从上述网络检测流程的分析可以看出,每个单元需要预测(B×5+C)值,假设将输入图像划分为S×S个网格单元,那么最终的预测值为S×S×(B×5+C)大小的张量,对于PASCAL VOC数据,最终的预测结果为7×7×30大小的张量。

在这里插入图片描述
可以看出,网络的最终输出为7×7×30大小的张量,这和前面的分析一致。该张量所代表的具体含义如图所示。对于每一个单元格,最后20个元素代表类别概率值,其中前面10个中有两个是边界框置信度,两者的乘积就是类别置信度,剩下8个元素代表边界框的(x,y,w,h)。

在这里插入图片描述

3.网络训练模型

3.1 训练策略

在训练之前,先在ImageNet上进行预训练,其预训练的分类模型采用图15-12中前20个卷积层,然后添加一个average-pool层和全连接层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,因此将网络的输入从224×224增加到448×448。整个网络的流程如图所示。

在这里插入图片描述
YOLO算法开始并没有像Goole Net那样直接构建24层的卷积网络,而是构建20层的卷积网络,然后在ImageNet数据集上预训练了前面的20层卷积层。Ren等人采用将卷积层和全连接层添加到预训练网络中的策略,进一步提高了网络的性能。因此,YOLO采用基于该原理在初始的20层卷积网络基础上,随机初始化后面的4层卷积层和2层全连接层。由于在检测中需要更详细的视觉信息,因此YOLO将网络模型的输入图像大小由224×224调整为448×448。网络最终预测输出结果的边界框的信息是(x,y,w,h),但是坐标(x,y)用对应网格的偏移量表示,然后归一化到(0,1)之间,坐标(w,h)用图像width和height归一化到(0,1)之间。由于在训练的过程中一般的激活函数Sigmoid会出现梯度消失、梯度爆炸的现象,因此YOLO采用LeakyReLU线性激活函数作为激活函数,其函数表达式如下:

在这里插入图片描述

3.2 代价函数的设定

YOLO算法的最终输出结果包含边界框的坐标、置信度得分、类别概率值3个部分,代价函数的设计目标是让这三方面达到很好的平衡。刚开始,YOLO简单地采用平方和误差作为代价函数,通过梯度下降法很容易达到最优化,但是这种代价函数的设计最终导致的结果是模型的拟合能力很差,主要原因在于代价函数的设定不合适,同时造成的不足之处有以下两个方面:

(1)8维的坐标误差和20维的类别概率误差,采用平方差误差时,两者视为同等重要,这显然是不合理的。

(2)在一幅图像中,如果一个网络中没有目标,就将这些网络中的格子单元的置信度设置为0。相比于较少的有目标的网络,这种方法是不可取的,会导致网络不稳定甚至不收敛。基于上述的不足,YOLO进一步改进代价函数,更重视8维坐标预测的误差损失,对其赋予更大的权值,同时减小不包含目标的单元格的置信度预测的权值。对于包含目标的单元格的置信度和类别概率预测的误差损失保持不变,同时将其权值设定为1。平方和误差同时对大边界框和小边界框中的误差采用相同的权值,改进后小边界框中的微小偏差显得尤为重要。因此,网络的代价函数将原来的w、h分别用[插图]和[插图]代替,这样做的好处在于进一步降低了敏感度之间的差异。最终,代价函数设计如下:

在这里插入图片描述

其中,第一项是边界框中心坐标的误差项,[插图]用于判断第i个网格中第j个边界框是否检测该目标,λcoord表示边界框坐标误差损失的权值,[插图]用于判断目标是否出现在网格中,λnoobj表示不包含目标边界框的置信度预测的误差权值。在上述代价函数中,只有当某个网络中有目标时才对预测误差进行惩罚,即增加权重系数。

总之,YOLO算法的缺点有两个方面:一方面,难以检测小目标,导致对视频中运动目标的检测出现漏检的现象;另一方面,对目标的定位不准,检测到的目标与实际目标之间存在偏差。

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

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

相关文章

【C++】面向对象编程引入 ③ ( 面向过程编程的结构化程序设计方法 | 结构化程序设计方法概念 / 特点 / 优缺点 | 面向对象编程引入 )

文章目录 一、面向过程编程的结构化程序设计方法1、结构化程序设计方法概念2、结构化程序设计方法特点3、结构化程序设计方法优缺点 二、面向对象编程引入 一、面向过程编程的结构化程序设计方法 如果使用 面向过程语言 ( 如 : C 语言 ) , 开发 大型 项目 , 一般使用 结构化程序…

uniapp微信小程序区分正式版,开发版,体验版

小程序代码区分是正式版,开发版,还是体验版 通常正式和开发环境需要调用不同域名接口,发布时需要手动更换 或者有些东西不想在正式版显示,只在开发版体验版中显示,也需要去手动隐藏 官方没有明确给出判断环境的方法&a…

scrollIntoView 导致整个页面上移问题

更改参数 block: ‘start’, behavior: smooth’更改为 behavior: ‘smooth’, block: ‘nearest’, inline: ‘start’ 在这里插入图片描述

Selenium之css怎么实现元素定位?

世界上最远的距离大概就是明明看到一个页面元素站在那里,但是我却定位不到!! Selenium定位元素的方法有很多种,像是通过id、name、class_name、tag_name、link_text等等,但是这些方法局限性太大, 随着自动…

一百五十九、Kettle——Kettle9.2通过配置Hadoop clusters连接Hadoop3.1.3(踩坑亲测、附流程截图)

一、目的 由于kettle的任务需要用到Hadoop(HDFS),所以就要连接Hadoop服务。 之前使用的是kettle9.3,由于在kettle新官网以及博客百度等渠道实在找不到shims的驱动包,无奈换成了kettle9.2,kettle9.2的安装…

Flink之Task解析

Flink之Task解析 对Flink的Task进行解析前,我们首先要清楚几个角色TaskManager、Slot、Task、Subtask、TaskChain分别是什么 角色注释TaskManager在Flink中TaskManager就是一个管理task的进程,每个节点只有一个TaskManagerSlotSlot就是TaskManager中的槽位,一个TaskManager中可…

【数据结构与算法】十大经典排序算法-希尔排序

🌟个人博客:www.hellocode.top 🏰Java知识导航:Java-Navigate 🔥CSDN:HelloCode. 🌞知乎:HelloCode 🌴掘金:HelloCode ⚡如有问题,欢迎指正&#…

数据结构之动态内存管理机制

目录 数据结构之动态内存管理机制 占用块和空闲块 系统的内存管理 可利用空间表 分配存储空间的方式 空间分配与回收过程产生的问题 边界标识法管理动态内存 分配算法 回收算法 伙伴系统管理动态内存 可利用空间表中结点构成 分配算法 回收算法 总结 无用单元收…

机器学习、cv、nlp的一些前置知识

为节省篇幅,不标注文章来源和文章的问题场景。大部分是我的通俗理解。 文章目录 向量关于向量的偏导数:雅可比矩阵二阶导数矩阵:海森矩阵随机变量随机场伽马函数beta分布数学术语坐标上升法协方差训练集,验证集,测试集…

SpringBoot案例 调用第三方接口传输数据

一、前言 最近再写调用三方接口传输数据的项目,这篇博客记录项目完成的过程,方便后续再碰到类似的项目可以快速上手 项目结构: 二、编码 这里主要介绍HttpClient发送POST请求工具类和定时器的使用,mvc三层架构编码不做探究 pom.x…

43、TCP报文(一)

本节内容开始,我们正式学习TCP协议中具体的一些原理。首先,最重要的内容仍然是这个协议的封装结构和首部格式,因为这里面牵扯到一些环环相扣的知识点,例如ACK、SYN等等,如果这些内容不能很好的理解,那么后续…

SASS 学习笔记

SASS 学习笔记 总共会写两个练手项目,成品在 https://goldenaarcher.com/scss-study 可以看到,代码在 https://github.com/GoldenaArcher/scss-study。 什么是 SASS SASS 是 CSS 预处理,它提供了变量(虽然现在 CSS 也提供了&am…

web集群学习:搭建 LNMP应用环境

目录 LNMP的介绍: LNMP组合工作流程: FastCGI介绍: 1、什么是 CGI 2、什么是 FastCGI 配置LNMP 1、部署LNMP环境 2、配置LNMP环境 LNMP的介绍: 随着 Nginx Web 服务的逐渐流行,又岀现了新的 Web 服务环境组合—…

面向对象编程(OOP):Python中的抽象与封装

文章目录 🍀引言🍀 类与对象🍀封装🍀继承🍀多态🍀面向对象编程的优势🍀使用面向对象编程的场景🍀实例化与构造函数🍀 成员属性和类属性🍀魔术方法&#x1f34…

初识Sentinel

目录 1.解决雪崩的方式有4种: 1.1.2超时处理: 1.1.3仓壁模式 1.1.4.断路器 1.1.5.限流 1.1.6.总结 1.2.服务保护技术对比 1.3.Sentinel介绍和安装 1.3.1.初识Sentinel 1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制 2.1.簇点链路 …

K8S调度

K8S调度 一、List-Watch 机制 controller-manager、scheduler、kubelet 通过 List-Watch 机制监听 apiserver 发出的事件,apiserver 通过 List-Watch 机制监听 etcd 发出的事件1.scheduler 的调度策略 预选策略/预算策略:通过调度算法过滤掉不满足条件…

什么是EM(最大期望值算法)

什么是EM(最大期望值算法) 在现实生活中,苹果百分百是苹果,梨百分白是梨。 生活中还有很多事物是概率分布,比如有多少人结了婚,又有多少人有工作, 如果我们想要调查人群中吸大麻者的比例呢?敏感问题很难得…

PHP8的字符串操作1-PHP8知识详解

字符串是php中最重要的数据之一,字符串的操作在PHP编程占有重要的地位。在使用PHP语言开发web项目的过程中,为了实现某些功能,经常需要对某些字符串进行特殊的处理,比如字符串的格式化、字符串的连接与分割、字符串的比较、查找等…

【Hyper-V】Windows11 家庭版怎么启用虚拟机Hyper-V

在电脑Windows11系统上启用虚拟机Hyper-V,打开 启用和关闭WIndows功能,找到其中一项Hyper-V,对于家庭版的系统用户来说,这个选项是没有的,接下来讲一讲怎么开启。 安装Hyper-V 创建一个文件名为Hyper-v.bat&#xff…

springcloud3 hystrix实现服务降级的案例配置2

一 服务降级的说明 1.1 服务降级说明 "服务器忙,请稍后在试"不让客户达等待,立即返回一个友好的提示。 1.2 服务降级的触发情况 1.程序运行异常; 2.超时; 3.服务熔断触发服务降级;4 .线程池/信号量打…