目标检测算法 - YOLOv1

文章目录

    • 1. 作者简介
    • 2. 目标检测综述
    • 3. YOLOv1算法
      • 3.1 预测阶段
      • 3.2 预测阶段后处理
      • 3.3 训练阶段

YOLO的全称是you only look once,指只需要浏览一次就可以识别出图中的物体的类别和位置。

YOLO是目标检测模型。目标检测是计算机视觉中比较简单的任务,用来在一张图篇中找到某些 特定的物体,目标检测不仅要求我们识别这些物体的种类,同时要求我们标出这些物体的位置。

YOLO能实现图像或视频中物体的快速识别,在相同的识别类别范围和识别准确率条件下,YOLO识别速度最快。YOLO有多种模型,其中最新的为V5,V5的特点是速度更快,识别准确率更高,权重文件更小,可以搭载在配置更低的移动设备上。

在这里插入图片描述


1. 作者简介

在这里插入图片描述

作者:Joseph Redmon,华盛顿大学博士,YOLO目标检测算法主要作者,YOLO是Joseph Redmon和Ali Farhadi等人于2015年提出的第一个基于单个神经网络的目标检测系统。

作者个人网站:https://pjreddie.com/


2. 目标检测综述

YOLO就是解决目标检测问题的计算机视觉算法。

计算机视觉能够解决很多问题:分类、检测、分割、关键点检测。

在这里插入图片描述

图像分割分为两种:语义分割(Semantic Segmentation)、示例分割(Instance Segmentation)

在这里插入图片描述

目标检测,综述文章推荐:

在这里插入图片描述

目标检测领域著名数据集:PASCAL-VOCILSVRCMS-COCOOID

yolo是在pascal vocms-coco数据集上进行评测的。

目标检测发展历程:

在这里插入图片描述

目标检测主要分为两个流派:one-stage detector和two-stage detector。

yolo属于one-stage detector。

two-stage(两阶段模型):先从图像中提取若干候选框,再逐一对这些候选框进行分类、甄别和调整坐标,最后得出结果。

one-stage(单阶段模型):不仅提取候选框,而且直接将全图输入到模型中,算法直接输出最终结果。是一个统一的端到端的系统。

one-stage代表模型:YOLO,SSD,Retina-Net。

two-stage代表模型:RCNN,SPPNet,Fast RCNN,Faster RCNN。

两阶段模型比较准确,但是比较耗时。而单阶段模型虽然较快,但是准确率不是太高,尤其是对于小目标,密集目标识别不太好。单目前yolo在识别率和速度上都已经非常好了。

在这里插入图片描述


3. YOLOv1算法

理解yolov1算法的关键在于,分开理解训练阶段和预测阶段。

3.1 预测阶段

预测阶段(测试阶段)就是,在模型已经训练成功后,输入未知图片,来对未知图片进行预测。此时不再需要反向传播,而是只需要前向推断。

这个模型训练出来之后是一个深度卷积神经网络。

YOLOv1网络结构:

在这里插入图片描述

输入为 448 × 448 × 3 448\times 448\times 3 448×448×3,输出为 7 × 7 × 30 7\times 7\times 30 7×7×30

在这里插入图片描述

首先网络将图像划分为了 S × S S\times S S×S个网格(在YOLOv1中 S = 7 S=7 S=7),所以为 7 × 7 7\times 7 7×7个网格,即49个。

每个网格可以预测出 b b b个预测框(在YOLOv1中 b = 2 b=2 b=2),即每个网格生成2个预测框,即共98个预测框。预测框可能很大,也可能很小。每个预测框包含(x,y,w,h,c)四个定位坐标和置信度c,即中心点的坐标和框的宽高,以及包含它是不是一个目标的置信度c。在上图中,使用框的粗细来表示置信度,粗的就表示置信度较高。

每个网格还能生成所有类别的条件概率。假设在它已经包含物体的情况下,它是某一个物体的概率,即生成了下面彩色的图。

把每一个预测框的置信度乘以类别的条件概率,就可以获得每一个预测框各类别的概率。

结合预测框的信息和网格类别信息,就可以获得最后的预测结果。这些信息都是从 7 × 7 × 30 7\times 7\times 30 7×7×30的张量中获取的。

那么为什么输出是 7 × 7 × 30 7\times 7\times 30 7×7×30呢?

包含两个预测框,每个预测框有5个参数(x,y,w,h,c)。两个框便是10个参数。在pascal voc中包含20个类别,那么5+5+20,那么就是30,这个30维的向量就是一个网格的信息,共有 7 × 7 7\times 7 7×7个网格,所以输出是 7 × 7 × 30 7\times 7\times 30 7×7×30

在这里插入图片描述

3.2 预测阶段后处理

预测阶段后处理需要进行置信度过滤非极大值抑制

对于YOLO而言,后处理就是对纷繁复杂的预测出来的98个预测框进行筛选、过滤,把重复的预测框只保留一个,最终获得目标检测的结果。把低置信度的框过滤掉,把重复的预测框过滤掉。

下面参考deepsystems.io的slides,详细解读一下inference过程。

在这里插入图片描述

如上图,输出为 7 × 7 × 30 7\times 7\times 30 7×7×30 7 × 7 7\times 7 7×7 7 × 7 7\times 7 7×7个网格。对于每一个网格,对应30个数字,这30个数字是由5+5+20构成。两个5分别为:第一个和第二个预测框的四个位置坐标和一个置信度构成。20:是网格对20个类别的类别概率。

置信度:该预测框包含物体的概率。

将20个类别的条件概率与预测框的置信度相乘,即条件概率乘以条件本身发生的概率,则变成了它的全概率。

在这里插入图片描述

每个网格因为对应两个预测框,所以每个网格都可以获得两个全概率。 如下图。即每个网格预测两个bounding box,则共有 7 × 7 × 2 = 98 7\times 7\times 2 = 98 7×7×2=98个预测框。98个预测框的置信度分别乘以每个类别的条件概率,共有20个类别,所以最终得到98个20维的向量。

在这里插入图片描述

这98个20维的向量,可视化出来就是下图。

在这里插入图片描述

我们先只看狗这一个类别,假如狗是这20个类别中的第一个类别。我们设置一个阀值 k k k,假设 k = 0.2 k=0.2 k=0.2,那么我们将这98个向量中狗的概率小于0.2的值全部设置为0。我们再按照狗的概率的大小进行排序,将概率大的放置在前面,将概率小的放置在后面。再对排序后的值进行非极大值抑制操作(NMS)。

在这里插入图片描述

非极大值抑制(NMS)

仍然只看狗的概率。对于98个向量,我们只看狗的概率这一行。上面我们已经对狗的概率进行了从高到低的排序。

对于非极大值抑制,先把最大的概率拿出来,然后将每一个概率都与这个最大的概率进行比较。如果它们的IoU大于某个预值(假设为 p p p),那么我们则认为这两个预选框重复识别了同一个物体,那我们则把这个低置信度、第概率的过滤掉,将其狗的概率值这是为0 。如果IoU的值小于我们设置的阀值 p p p,那么则保留。重复以上过程,直到最低概率值与最大概率值进行比对完成。

然后,我们再选择第二大的概率值,让其他每一个比这个第二大概率低的概率都与这个第二大的概率进行比较。重复上述操作。

在这里插入图片描述

上述只是对狗这一个类别进行了操作,其他类别也按上述进行操作,最终就会得到检测结果。

在这里插入图片描述

将不为0的bounding box找出来,最后进行可视化。

在这里插入图片描述

注意:

  • 后处理只是用于预测阶段,在训练阶段不需要进行NMS。

3.3 训练阶段

训练阶段,即反向传播阶段。

深度学习或监督学习的训练是通过梯度下降和反向传播方法迭代的去微调神经元中的权重,使得损失函数最小化。

目标检测是一个典型的监督学习问题。

在这里插入图片描述

在训练集上,一定有人已经用labelme或者labelimg这样的标注工具画出了ground-truth,如上图的绿色框,这是人工标注出来的。

我们的算法就是要让预测结果尽量的去拟合这个ground-truth,使得损失函数最小化。

这个绿色框的中心点落在哪个grid cell内就应该由哪个grid cell预测出的bounding box去负责拟合ground-truth。每个grid cell生成两个bounding box,那么就应该由这两个bounding box中的一个去负责拟合这个ground-truth。并且,这个grid cell输出的类别也应该是这个ground-truth的类别。所以每个grid cell只能预测出一个物体。49个grid cell最多只能预测49个物体,这也是yolov1检测密集目标和小目标性能比较差的原因。

每个网格都预测出两个预测框,那么该由哪一个预测框去负责拟合ground-truth呢?

应该由和ground-truth的IoU比较大的那个预测框去负责拟合。那么另外一个预测框则什么都不需要做。

如果没有预测框中心点落在这个网格中,则这个网格所预测的两个预测框都不再去拟合ground-truth,即不需要做什么事情。

YOLOv1损失函数

在这里插入图片描述

损失函数包含5项:

  • 负责检测物体的bbox中心点定位误差
  • 负责检测物体的bbox宽高定位误差
  • 负责检测物体的bbox confidence误差
  • 不负责检测物体的bbox confidence误差
  • 负责检测物体的grid cell分类误差

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV1)模型算法详解

【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV1)模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】GoogLeNet(InceptionV1)模型算法详解前言GoogLeNet讲解Inception结构InceptionV1结构1x1卷积的作用 GoogLeNet模型结构GoogLeNet Pytorch代码完整…

Maven-构建生命周期与插件

一、概念和基础 Maven针对项目的构建和发布定义了一系列明确的步骤,根据作用不同这些步骤分属于不同的生命周期。Maven针对每个步骤都有对应的默认插件,Maven在构建过程中是通过调用这些插件完成整个过程的。开发者只需要通过简单的命令就可以驱动maven…

Microsoft SDKs 有文件重定义导致编译失败的处理

一个32位的mfc项目,之前采用vs2019编译,现在换了电脑(系统是win10),采用vs2022编译时,提示如下错误: 1>------ 已启动生成: 项目: aAnsys, 配置: Debug Win32 ------ 1>cl : 命令行 warning D9035: “Gm”选项…

Luckysheet 实现excel多人在线协同编辑

前言 前些天看到Luckysheet支持协同编辑Excel,正符合我们协同项目的一部分,故而想进一步完善协同文章,但是遇到了一下困难,特此做声明哈,若侵权,请联系我删除文章! 若侵犯版权、个人隐私&#x…

图及谱聚类商圈聚类中的应用

背景 在O2O业务场景中,有商圈的概念,商圈是业务运营的单元,有对应的商户BD负责人以及配送运力负责任。这些商圈通常是一定地理围栏构成的区域,区域内包括商户和用户,商圈和商圈之间就通常以道路、河流等围栏进行分隔。…

酷开科技持续推动智能投影行业创新发展

近年来,投影仪逐渐成为年轻人追捧的家居时尚单品。据国际数据公司(IDC)报告显示,2022年中国投影机市场总出货量505万台,超80%为家用投影仪。相比于电视,投影仪外观小巧、屏幕大小可调节,无论是卧…

PostgreSql中解析JSON字段和解析TEXT中的JSON字段

初始化操作 创建表 CREATE TABLE orders ( "ID" int8 NOT NULL,"info_j" json NOT NULL,"info_t" text NOT NULL );初始化表 INSERT INTO orders("ID", "info_j","info_t") VALUES (1, {"name":&qu…

setViaGenMode

1.命令描述 setViaGenMode用于设置vias的全局变量,包括使用addRing / addStripe命令连接rings 、stripes,editPowerVia、sroute、addSplitPowerVia以及手拉线使用的editAddRoute/editCommitRoute。 2.-optimize_cross_via true false 未完待续

人大金仓三大兼容:SQL Server迁移无忧

SQL Server在数据库领域一直占据着重要地位。作为一款成熟稳定的关系型数据库管理系统,SQL Server在国内有着广泛的用户群体,医疗、海关、政务等行业的核心业务系统多采用SQL Server数据库。随着政策与市场的双重驱动,信息技术应用创新产业的…

Spring RabbitMQ那些事(1-交换机配置消息发送订阅实操)

这里写目录标题 一、序言二、配置文件application.yml三、RabbitMQ交换机和队列配置1、定义4个队列2、定义Fanout交换机和队列绑定关系2、定义Direct交换机和队列绑定关系3、定义Topic交换机和队列绑定关系4、定义Header交换机和队列绑定关系 四、RabbitMQ消费者配置五、Rabbit…

C语言面试

数据类型(基本内置类型) char //字符数据类型 short //短整型 int //整型 long //长整型 long long //更长的整型 float //单精度浮点数 double //双精度浮点数 类型的基本归类 整形家族: …

英伟达发布RAPIDS cuDF框架 pandas在GPU上运行速度快了150倍

11月9日 消息:Nvidia 发布了一款名为 RAPIDS cuDF 的新版本,据称可以将 pandas 运行在 GPU 上,并且性能提升了150倍。pandas 是一款流行的基于 Python 的数据框架库,用于数据处理和分析。它的开源版本由 Wes McKinney 开发和发布&…

RT-Thread提供的网络世界入口 -net组件

作为一款在RTOS领域对网络支持很丰富的RT-Thread,对设备联网功能的支持的工具就是net组件。 位于/rt-thread/components/net路劲下,作为一款基础组件,env与Studio的工程配置项界面的配置项都依赖该目录下的Kconfig。 我们对网络功能的选择&am…

关于卷积神经网络的步幅(stride)

认识步幅(stride) 卷积核从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动,我们将每次滑动的行数和列数称为步幅。 计算步幅 假设输入的形状n∗n,卷积核的形状为f∗f&#xff0…

css排版—— 一篇优雅的文章(中英文) vs 聊天框的特别排版

文章 <div class"contentBox"><p>这是一篇范文——仅供测试使用</p><p>With the coming of national day, I have a one week holiday. I reallyexpect to it, because it want to have a short trip during these days. Iwill travel to Ji…

机器学习模板代码(期末考试复习)自用存档

机器学习复习代码 利用sklearn实现knn import numpy as np import pandas as pd from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import GridSearchCVdef model_selection(x_train, y_train):## 第一个是网格搜索## p是选择查找方式:1是欧…

Vue3 + Vite + Ts + Router搭建项目

1、新建文件夹 从新建的文件夹cmd进入终端 2、安装vite—依据vite创建vue3项目 2.1、运行 npm init vitelatest2.2.1、输入项目名称 2.2.2、选择vue 2.2.3、选择TypeScript语言 3、安装依赖项 3.1、进入刚才创建的文件夹 cd vite-project 3.2、查看镜像 #查看当前源 npm con…

【uniapp+vue3/vue2】ksp-cropper高性能图片裁剪工具,详解

效果图&#xff1a; 1、ksp-cropper是hbuilder插件市场中的一款插件&#xff0c;兼容vue2和vue3 ksp-cropper插件安装地址&#xff0c;直接点击跳转 2、插件用法相对简单 &#xff08;1&#xff09;只要url有值就会显示插件&#xff0c;为空就会隐藏插件 &#xff08;2&#…

自动化测试框架 —— pytest框架入门篇

今天就给大家说一说pytest框架。 今天这篇文章呢&#xff0c;会从以下几个方面来介绍&#xff1a; 1、首先介绍一下pytest框架 2、带大家安装Pytest框架 3、使用pytest框架时需要注意的点 4、pytest的运行方式 5、pytest框架中常用的插件 01、pytest框架介绍 pytest 是 pytho…

国产猫罐头可以长期作为主食吗?我家的优质TOP的猫罐头分享

我最近一直在调查国产猫罐头可以长期作为主食吗&#xff1f;看看我的购物订单&#xff0c;我已经尝试了几十款了。今天&#xff0c;我想和大家分享一些关于国产猫罐头的经验和见解。 近年来&#xff0c;国产宠粮市场取得了突破性的进展&#xff0c;各个猫粮商在配方、营养数据…