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.mzph.cn/news/40369.shtml

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

相关文章

Davinci 报表工具 0.3.0-rc release 文本框模糊查询不生效问题

背景: 在使用过程中发现davinci 的控制器配置中, 取值配置的对应关系设置 包含 或 不包含时 不生效, 不能实现模糊匹配效果, 只能精确查询; 问题分析: 通过跟踪接口及相应代码, 发现在sql 拼接时没有对 like 和 not like 类型的值两侧添加百分号, 导致模糊查询失败 调用过程…

CentOS系统环境搭建(七)——Centos7安装MySQL

centos系统环境搭建专栏🔗点击跳转 坦诚地说,本文中百分之九十的内容都来自于该文章🔗Linux:CentOS7安装MySQL8(详),十分佩服大佬文章结构合理,文笔清晰,我曾经在这篇文章…

Kotlin 使用 View Binding

解决的问题: 《第一行代码——Android》第三版 郭霖 P277 视图绑定的问题 描述: kotlin-android-extensions 插件已经弃用 butter knife 已经弃用 解决办法 推荐使用 View Binding 来代替 findViewById 使用方法 1、配置 build.gradle 2、在act…

绝对值函数的可导性

绝对值函数的可导性 声明:下面截图来自《考研数学常考题型解题方法技巧归纳》

利用Figlet工具创建酷炫Linux Centos8服务器-登录欢迎界面-SHELL自动化编译安装代码

因为我们需要生成需要的特定字符,所以需要在当前服务器中安装Figlet,默认没有安装包的,其实如果我们也只要在一台环境中安装,然后需要什么字符只要复制到需要的服务器中,并不需要所有都安装。同样的,我们也可以利用此生成的字符用到脚本运行的开始起头部分,用ECHO分行标…

使用python读Excel文件并写入另一个xls模版

效果如下: 原文件内容 转化后的内容 大致代码如下: 1. load_it.py #!/usr/bin/env python import re from datetime import datetime from io import BytesIO from pathlib import Path from typing import List, Unionfrom fastapi import HTTPExcep…

睿趣科技:抖音开网店现在做还来得及吗

随着社交媒体的迅速发展,抖音作为一款短视频平台,已经在年轻人中间取得了巨大的成功。而近年来,越来越多的人开始考虑在抖音上开设网店,以迎合这一潮流。那么,抖音开网店现在还来得及吗? 首先,要明确的是&…

一篇文章教会你搭建私人kindle图书馆,并内网穿透实现公网访问

搭建私人kindle图书馆,并内网穿透实现公网访问 在电子书风靡的时期,大部分人都购买了一本电子书,虽然这本电子书更多的时候是被搁置在储物架上吃灰,或者成为盖泡面的神器,但当亚马逊发布消息将放弃电子书在中国的服务…

利用Python隧道爬虫ip轻松构建全局爬虫网络

嘿,爬虫程序员们!你们有没有碰到过需要大规模数据爬取的情况?也许你们之前遇到过网站的反爬措施,卡住你们的进度。别担心,今天我来分享一个利用Python隧道爬虫ip实现的方法,帮助你们轻松搭建全局爬虫ip网络…

IC设计仿真云架构

对于IC仿真来说,最重要的是要安全、可维护、高性能的的HPC环境环境。 那么云上如何搭建起一套完整的IC仿真云环境呢? 这种架构应该长什么样子? 桌面虚拟化基础架构 将所有桌面虚拟机在数据中心进行托管并统一管理;同时用户能够…

嵌入式:ARM Day4

一、自己编写代码实现三盏灯点亮 源码: .text .global _start _start: 进行一次初始化bl RCC_INITbl LED1_INITbl LED2_INITbl LED3_INITb looploop: 循环开关灯bl LED1_ONbl delay_1sbl LED1_OFFbl delay_1sbl LED2_ONbl delay_1sbl LED2_OFFbl delay_1sbl…

如何进行网络活动监控

组织的 IT 基础架构中的每个网络设备上都发生了大量活动,例如数据包传输、来自网络协议的消息、设备状态事件等。网络活动成为在检测到问题时识别网络瓶颈的面包屑,因此即使是最微小的网络活动也应受到监控,因为它直接影响整体网络性能、运行…

UI设计师个人工作总结范文精选

UI设计师个人工作总结范文(一) 在忙忙碌碌中,2019年又将过去了,在这一年当中,设计部无论是在运作模式、设计产值、还是人员结构,各方面的变化都比较大。 设计部的运作模式是从7月底开始进行调整的,以独立承包制的运营方…

python爬虫5:requests库-案例3

python爬虫5:requests库-案例3 前言 ​ python实现网络爬虫非常简单,只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点,方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论,并不会对网…

mysql 01.三范式,数据类型

01.概念的区分: mysql是属于DBMS层次的,sql语句是用于DBMS的语句。 02.sql语句详细介绍: SQL的概述Structure Query Language(结构化查询语言)简称SQL,它被美国国家标准局(ANSI)确定为关系型数据库语言的美国标准,后…

conda常用命令及国内镜像源

conda命令使用介绍 启动conda source ~/.bashrc帮助目录 conda create -h检查conda版本 conda --version升级当前版本的conda conda update conda环境管理 列出所有的环境 conda info -e conda env list安装一个不同版本的python新环境 conda create --name py27 pytho…

JavaWeb-DAO设计模式

目录 DAO设计模式 1.认识DAO 2.DAO各部分的详解 3.DAO设计模式流程 DAO设计模式 1.认识DAO DAO(Data Acess Object 数据库访问对象)的主要功能是操作数据库,所以DAO在标准开发架构中数据数据层,以下是标准开发的架构 客户层:目前使用B/…

Openai中的tokens怎么估计

大规模语言模型(LLM)的出现给自然语言处理领域带来了变革的可能性,Openai开放了chatgpt的API,方便了开发人员使用LLM的推理能力,注册时赠送5美元的使用额度,有效期3个月。 如果想便捷的使用chatgpt的API&a…

Jmeter 二次开发 函数助手 AES加解密

Jmeter 二次开发 函数助手 AES加解密 1. 环境准备2. 关键技术说明2.1 离线导包2.2 示例代码 3. 代码包4. 结果演示 1. 环境准备 IDE :IntelliJ IDEA 2021.1.1 x64JAVA环境 :jdk1.8.0_251离线导包:导入Jmeter安装目录下lib/ext下的ApacheJmet…

Martin_DHCP_V3.0 (DHCP自动化泛洪攻击GUI)

Github>https://github.com/MartinxMax/Martin_DHCP_V3.0 首页 Martin_DHCP_V3.0 自动化DHCP洪泛攻击 Martin_DHCP_V3.0 使用方法 安装三方库 #python3 1.RunMe_Install_Packet.py 攻击路由器 #python3 Martin_DHCP_Attack.py 填写网卡 填写攻击次数 开始运行