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算法的缺点有两个方面:一方面,难以检测小目标,导致对视频中运动目标的检测出现漏检的现象;另一方面,对目标的定位不准,检测到的目标与实际目标之间存在偏差。
相关文章:

OpenCV实例(九)基于深度学习的运动目标检测(一)YOLO运动目标检测算法
基于深度学习的运动目标检测(一) 1.YOLO算法检测流程2.YOLO算法网络架构3.网络训练模型3.1 训练策略3.2 代价函数的设定 2012年,随着深度学习技术的不断突破,开始兴起基于深度学习的目标检测算法的研究浪潮。 2014年,…...

CI/CD流水线实战
不知道为什么,现在什么技术都想学,因为我觉得我遇到了技术的壁垒,大的项目接触不到,做的项目一个字辣*。所以,整个人心浮气躁,我已经得通过每天的骑行和长跑缓解这种浮躁了。一个周末,我再次宅在…...

详解配置交换机多生成树MSTP+VRRP 的典型组网
详解配置交换机多生成树MSTPVRRP 的典型组网 组网: 1. 这是一个由三台交换机组成的倒三角型二层交换网络;网络中有4个VLAN:10、20、30、40;接口编号如图所示;SW3为接入层交换机,SW1、SW2为汇聚层交换机&am…...

二.net core 自动化发布到docker (Jenkins安装之后向导)
目录 参考资料:https://www.jenkins.io/doc/book/installing/docker/#setup-wizard Post-installation setup wizard.(安装后安装向导) 基于上一篇文章安装,在安装并运行Jenkins(不包括使用Jenkins Opera…...

【设计模式——学习笔记】23种设计模式——解释器模式Interpreter(原理讲解+应用场景介绍+案例介绍+Java代码实现)
案例引入 通过解释器模式来实现四则运算,如计算ab-c的值,具体要求 先输入表达式的形式,比如abc-de,要求表达式的字母不能重复在分别输入a,b,c,d,e的值最后求出结果 传统方案 编写一个方法,接收表达式的形式…...

【计算机网络】——数据链路层
二、组帧 1、字符计数法 帧头部使用一个字符来表示帧的大小(包括第一个计数字符) (此处一字符一个字节) 2、字符填充收尾定界法 特定字符来定界帧的首和尾。若帧中数据段出现等同于特定字符的字符内容,前置一个转义字符。(类似于正则表达…...

数据结构:栈和队列(超详细)
目录 编辑 栈: 栈的概念及结构: 栈的实现: 队列: 队列的概念及结构: 队列的实现: 扩展知识: 以上就是个人学习线性表的个人见解和学习的解析,欢迎各位大佬在评论区探讨&#…...

AI项目二:基于mediapipe的虚拟鼠标控制
若该文为原创文章,转载请注明原文出处。 一、项目介绍 由于博主太懒,mediapipe如何实现鼠标控制的原理直接忽略,最初的想法是想控制摄像头识别手指控制鼠标,达到播放电影的效果。基本上效果也是可以的。简单的说是使用mediapipe检…...

EVE-NG 隐藏没有镜像的模板
eve-ng 默认情况下,在添加node时,会列出所有的模板,这样用着很不方便。 通过以下方式,可以使没有设备的模板不可见 cp /opt/unetlab/html/includes/config.php.distribution /opt/unetlab/html/includes/config.php 打开 config…...

机器学习理论笔记(一):初识机器学习
文章目录 1 前言:蓝色是天的机器学习笔记专栏1.1 专栏初衷与定位1.2 本文主要内容 2 机器学习的定义2.1 机器学习的本质2.2 机器学习的分类 3 机器学习的基本术语4 探索"没有免费的午餐"定理(NFL)5 结语 1 前言:蓝色是天…...
Programming abstractions in C阅读笔记: p114-p117
《Programming Abstractions in C》学习第48天,p114-p117,总结如下: 一、技术总结 主要通过random number介绍了随机数的相关用法,interface示例(random.h),client program示例(craps.c)。 #include <stdio…...

分布式应用:Zabbix监控Tomcat
目录 一、理论 1.Zabbix监控Tomcat 二、实验 1.Zabbix监控Tomcat 三、问题 1.获取软件包失败 2.tomcat 配置 JMX remote monitor不生效 3.Zabbix客户端日志报错 一、理论 1.Zabbix监控Tomcat (1)环境 zabbix服务端:192.168.204.214 …...

《起风了》C++源代码
使用方法 Visual Studio、Dev-C、Visual Studio Code等C/C创建一个 .cpp 文件,直接粘贴赋值即可。 #include <iostream> #include <Windows.h> #pragma comment(lib,"winmm.lib") using namespace std; enum Scale {Rest 0, C8 108, B7 …...

Grafana展示k8s中pod的jvm监控面板/actuator/prometheus
场景 为保障java服务正常运行,对服务的jvm进行监控,通过使用actuator组件监控jvm情况,使用prometheus对数据进行采集,并在Grafana展现。 基于k8s场景 prometheus数据收集 配置service的lable,便于prometheus使用labl…...

实例038 设置窗体在屏幕中的位置
实例说明 在窗体中可以设置窗体居中显示,本例通过设置窗体的Left属性和Top属性可以准确设置窗体的位置。运行本例,效果如图1.38所示。 技术要点 设置窗体在屏幕中的位置,可以通过设置窗体的属性来实现。窗体的Left属性表示窗体距屏幕左侧的…...

合成数据及其在AI领域中的作用
什么是合成数据? 合成数据是由人工创建而非从现实生活中获得的数据,它从机器学习对数据的需求发展而来。最初,为了精确训练AI模型,必须获得涵盖所有可能场景的训练数据。如果某个场景没有发生或未被获得,就没有相应的…...

Java内存区域(运行时数据区域)和内存模型(JMM)
Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。 而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 …...
【HDFS】hdfs的count命令的参数详解
Usage: hadoop fs -count [-q] [-h] [-v] [-x] [-t [<storage type>]] [-u] [-e] [-s] <paths...
Lombok注解在JSON化中,JSON生成额外生成字段问题
问题描述: 定义如下对象 Dataclass A{private String A;public String getC() {return "abab";}} 执行如下逻辑 Autowiredprivate ObjectMapper objectMapper;Testpublic void test4() throws Exception {A a new A();a.setA("a");System.ou…...

docker中的jenkins之流水线构建
docker中的jenkins之流水线构建项目 1、用node这种方式(因为我用pipeline方式一直不执行,不知道为什么) 2、创建项目 创建两个参数,一个是宿主端口号,一个是docker中的端口号 3、使用git项目中的Jenkinsfile 4、编写…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...