【卷积神经网络】YOLO 算法原理

在计算机视觉领域中,目标检测(Object Detection)是一个具有挑战性且重要的新兴研究方向。目标检测不仅要预测图片中是否包含待检测的目标,还需要在图片中指出它们的位置。2015 年,Joseph Redmon, Santosh Divvala 等人提出第一个 YOLO 模型,该模型具有实时性高、支持多物体检测的特点,已成为目标检测领域热门的研究算法。本文主要介绍 YOLO 算法及其基本原理。

目录

1 YOLO 算法介绍

2 YOLO 算法原理

2.1 滑动窗口的卷积实现

2.2 非极大值抑制

2.3 Anchor Box


1 YOLO 算法介绍

        在目标检测算法的发展过程中,人们一开始采用 Proposal + 图像分类的思路,Proposal 用于预测目标位置,分类用于识别目标的类别。这类算法被称为 Two-stage 算法,例如 R-CNN,Faster R-CNN 算法。

        2015 年,Joseph Redmon, Santosh Divvala 等人在《You Only Look Once: Unified, Real-Time Object Detection》论文中提出 YOLO 模型,开启了 YOLO 算法的研究热潮。经过后来人们的不断改进,YOLO 算法已经发展成为一个庞大的家族,后来人们把第一个 YOLO 模型称为 YOLO v1 模型。

YOLO 检测算法的大致处理步骤:

(1)调整输入图像的大小为 448 x 448;

(2)使用卷积网络对输入图像执行一次预测;

(3)对预测结果进行非极大值抑制。

        YOLO 模型使用单个卷积网络同时预测多个边界框,以及对应框的类别概率。与传统的目标检测方法相比,这种统一的模型有以下优点:

        (1)YOLO 的预测速度快,由于模型将检测框转化为回归问题,因此只用一个网络同时输出目标的位置与分类信息;

        (2)YOLO 模型在进行预测时对图像进行全局推理。与基于滑动窗口和区域建议的技术不同,YOLO 在训练和测试期间看到整个图像,因此它隐式地学习关于类别及其形状的上下文信息。

参考论文链接:

[1] You Only Look Once: Unified, Real-Time Object Detection

[2] YOLO9000: Better, Faster, Stronger

2 YOLO 算法原理

        YOLO 算法把输入图像分成 S x S 个方格,每个方格输出一个 B x 5 + C 维的张量。这里,B 是每个方格预测方框(Bounding box)的数目,C 表示需要检测的对象类别数目。如果检测目标的中点落在某个方格内,那么目标物体就由该方格进行检测与输出。

        YOLO 算法采用了相对坐标的方法,并使用 Logistic 激活函数,使每个坐标的取值落在区间 0 到 1。目标检测网络在每个边界框处预测 5 个值,分别是 t_{x}, \, t_{y}, \, t_{w}, \, t_{h} 和 t_{o}. 如果单元格相对图像左上角偏移记为 (c_{x}, c_{y}),并且先验边界框宽度、高度分别记为 p_{w}, \, p_{h},对应的预测结果为:

b_{x} = \sigma (t_{x}) + c_{x}

b_{y} = \sigma (t_{y}) + c_{y}

b_{w} = p_{w} \, e^{t_{w}}

b_{h} = p_{h} \, e^{t_{h}}

Pr(object) * IOU(b, object) = \sigma (t_{o})

2.1 滑动窗口的卷积实现

        YOLO v1 检测网络有 24 个卷积层,以及最后的 2 个全连接层。中间交替的 1×1 卷积层用于减少先前层的特征数量。

        相比 YOLO v1 模型,YOLO v2 输出层使用卷积层代替全连接层。这样处理之后,间接地使用卷积算子实现滑动窗口的功能,滑动窗口移动的步长是卷积运算的步长。最终检测网络只需执行一次检测过程,就可以同时输出不同区域的预测结果。

2.2 非极大值抑制

        把输入图像分成多个方格的设计思路,增强了网络检测多个物体的能力。通常一个待检测的对象由一个方格进行预测,然而对于较大的检测对象,同一个对象可能会触发多个预测框,非极大值抑制(Non-max suppression)可以解决这个问题。

非极大值抑制的大致过程如下:

(1)选择预测得分最高的预测框;

(2)遍历剩下的预测框,逐个计算 IoU 值;

(3)如果 IoU 值超过阈值(通常设为 0.5 或 0.6),则丢弃预测框,否则保留;

(4)选择预测得分第二高的预测框,重复 (2)~(3)步骤。

2.3 Anchor Box

        当图像中存在两个物体,且这两个物体的中点均落在同一个方格中时,目标检测网络只能输出其中一个物体的位置结果。这时就需要引入 Anchor box 的设计思路。
        Anchor box 的思路是,预先定义两个形状不同的预测框,然后重新定义预测标签。预测标签同时包含 anchor box1 与 anchor box2 的预测信息。在训练网络时,检测对象会分配给包含其中点的方格,并且具有较高 IoU 值的 anchor box。

        由于这些预测框带有先验信息,因此也被称为先验框。

        相比手工选择的方式,YOLO v2 模型对训练集的标注框进行了 k-means 聚类。在聚类个数 k 取 5 时,模型在召回率与复杂性之间折衷。

【参考文献】

[1] Joseph Redmon, et al. “You only look once: Unified, real-time object detection.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.

[2] Joseph Redmon, et al. “YOLO9000: Better, Faster, Stronger”  Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2017.

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

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

相关文章

【问题总结】为什么路由器可以互联下三层不同的协议?【从隔离冲突域和广播域的角度分析】【数据传输过程】

问题 要想知道为什么路由器可以互联下三层不同的协议,我们首先要把一个包的传输弄清楚,而在第二层是帧的模式,第三层是IP数据报的格式,我们先分析发送方式,再来解决问题。 四种不同的发送方式 数据链路层 链路层单…

物联网AI MicroPython传感器学习 之 mpu6050六轴陀螺仪传感器

学物联网,来万物简单IoT物联网!! 一、产品简介 MPU6050是一款6轴运动传感器,它集成了3 轴MEMS 陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor&#xf…

Android Studio 下载地址

一、Android Studio 下载地址及版本说明 1.Android 开发者官网:(1)Android Developers (全球,需科学上网) (2)https://developer.android.google.cn/index.html (国内&a…

moviepy处理手机端图片旋转问题

1.手机拍摄的图片或者在ffmpeg处理的时候,会读取图片的元数据从而进行旋转 左边是拍摄的图片,右侧是进行处理以后得图片 video VideoFileClip(file_path) if video.rotation in (90, 270):video video.resize(video.size[::-1])video.rotation 0

生成一篇博客,详细讲解springboot的单点登录功能,有流程图,有源码demo

SpringBoot是目前非常流行的一个Java开发框架,它以简洁的配置和快速的开发效率著称。在实际应用中,单点登录是一个非常重要的功能,它可以让用户在多个应用系统中使用同一个账号登录,提高用户体验和安全性。本文将详细讲解如何在Sp…

YouTube博主数据信息资源

YouTube博主数据信息资源 🔥我是一位拥有10年编程经验的程序猿,为你带来一个全新的优质资源 🔍您是否在寻找最新、最活跃的YouTube博主数据,以助力你的项目、营销或研究? 我们的数据,您的优势:…

2023-JS

如何判断两个数组的内容是否相等 1.数组 let arr1 [1,2,3,4] let arr2 [1,2,3,4]方案: (一):通过转成字符串:JSON.stringfity() (二):通过循环2.数组对象 let arr1 [{id: 1, name: s}] let arr2 [{id: 1, name: s},{id: 2, name: a}] post为什么会发…

ZYNQ连载05-Vitis更新xsa硬件配置

ZYNQ连载05-Vitis更新xsa硬件配置 1. 简述 在开发过程中,Vivado中硬件配置在开发过程中有所变动,Vitis需要根据Vivado生成的xsa文件,更新相应的BSP配置 2. 操作步骤

Node编写更新用户信息接口

目录 前言 定义路由和处理函数 验证表单数据 实现更新用户基本信息的功能 前言 继前面几篇文章,本文介绍如何编写更新用户信息接口 定义路由和处理函数 路由 // 更新用户信息接口 router.post(/userinfo, userinfo_handler.updateUserinfo) 处理函数 // 导…

机器学习-朴素贝叶斯之多项式模型

多项式模型: 记住一定用于离散的对象,不能是连续的 于高斯分布相反,多项式模型主要适用于离散特征的概率计算,切sklearn的多项式模型不接受输入负值 因为多项式不接受负值的输入,所以样本数据的特征为数值型数据&…

【2023年冬季】华为OD统一考试(B卷)题库清单(已收录345题),又快又全的 B 卷题库大整理

目录 专栏导读华为OD机试算法题太多了,知识点繁杂,如何刷题更有效率呢? 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治递归…

【PC电脑windows-学习样例generic_gpio-ESP32的GPIO程序-基础样例学习】

【PC电脑windows-学习样例generic_gpio-ESP32的GPIO程序-基础样例学习】 1、概述2、实验环境3、 物品说明4、自我总结5、本次实验说明6、实验过程(1)复制目录到桌面(2)手动敲写(3)反复改错(4&am…

09 用户态跟踪:如何使用eBPF排查应用程序?

09 用户态跟踪:如何使用eBPF排查应用程序? sudo bpftrace -e usdt:/usr/bin/python3:function__entry { printf("%s:%d %s\n", str(arg0), arg2, str(arg1))} # -*- coding: UTF-8 -*- import socket from socket import SOL_SOCKET, SO_R…

时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测

时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-LSTM差分自回归移动平均模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Python实现ARIM…

【数值计算汇总】js前端数值计算校验转换

前言 这个合集功能主要是为了处理前端计算数据 因为我的项目有很多表格公式计算是前端写的 所以有一个很麻烦的事情就是加减乘除的时候因为各种情况导致报错 最常见的就是后端传的值不规范 有时候这个字段没有值的时候给我返回的是数字0,有时候字符串数字0&#xf…

SOLIDWORKS PDM 2024数据管理5大新功能

1. 改进的视觉内容 • 通过装配体可视化功能,在 SOLIDWORKS 中以图形方式查看零部件数据,如工作流程状态。• 使用特定图标迅速识别焊件切割清单零部件。 优点:重要数据和系统信息一目了然。 2.增强的数据保护和跟踪功能 •保护“包含”和…

【jvm】虚拟机栈之动态链接

目录 一、说明二、代码示例三、生成的字节码四、字节码说明4.1 常量池4.1 方法调用4.3 变量4.4 字符串4.5 父类Object4.6 System类 一、说明 1.指向运行时常量池的方法引用 2.每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用 3.包含这个引用的目的就是为了支持…

代码随想录算法训练营第4天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交 、142.环形链表II

JAVA语言编写 24. 两两交换链表中的节点 谷歌、亚马逊、字节、奥多比、百度 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。…

Openssl数据安全传输平台010:jasoncpp 1.9.5编译及常用API- Windows/Centos8-含测试代码

文章目录 0. 代码仓库1 安装注意版本问题1.1 windows 下的安装1.1.1 使用cmake生成sln工程1.1.2 使用sln工程生成静态库 -Debug 1.2 Linux 下的安装1.2.1 安装jsoncpp1.2.2 旧版本0.10.x版本相关环境配置问题 2 Winsows环境下编译 c 测试文件: json-test.cpp2.1 配置…