目标检测YOLO算法,先从yolov1开始

news2024/12/26 9:22:07

学习资源

有一套配套的学习资料,才能让我们的学习事半功倍。

yolov1论文原址:You Only Look Once: Unified, Real-Time Object Detection

代码地址:darknet: Convolutional Neural Networks (github.com)

深度学习经典检测方法

  • one-stage(单阶段):YOLO系列

最核心的优势:速度非常快,适合做实时检测任务! 但是缺点也是有的,效果通常情况下不会太好!

  • two-stage(两阶段):Faster-rcnn Mask-Rcnn系列

速度通常较慢(5FPS),但是效果通常还是不错的! 非常实用的通用框架MaskRcnn,可以去学习一下。

应用:

二者算法流程不同,一阶段检测一步到位,直接预测类别和坐标。两阶段检测会先生成建议框,再进行分类和回归。所以两阶段更适合对精度要求高的场景,如工业质检;而单阶段更适合要求速度的场景,如视频监控。

YOLO 核心思想

YOLO采用直接回归的思路,将目标定位和目标类别预测整合于在单个神经网络模型中。

由于不像Faster-rcnn那样提取region proposal,YOLOv1的检测流程很简单:

  1. Resize image:将输入图片resize到448x448。
  2. Run ConvNet:使用CNN提取特征,FC层输出分类和回归结果。
  3. Non-max Suppression:非极大值抑制筛选出最终的结果。

目标检测逻辑

这个部分是一个难点,就是我没有建议框,那要怎么定位那些包含目标的区域并固定输出呢?

YOLOv1就将图像分成SxS个网格,每个网格预测B个边界框。这样就利用网格划分了空间,使每个网格单元负责预测自己所包含的目标。

这里的S x S我们就按照如图所示认为是7 x 7,每个网格预测B个Bbox(边界框) ,以及每个边界框的confidence值,confidence就是置信度。 所以每个边界框对应5个参数:[x,y,w,h,c]。

  • (x,y) 表示边界框中心相对于网格的坐标;
  • w,h 表示边界框相对于整张图像的宽和高(意思是边界框的中心坐标必须在网格内,但其宽和高不受网格限制、可以随意超过网格大小);
  • c即为confidence,其定义为:当预测的边界框内不存在目标时,置信度(Confidence)应该置为0。当预测的边界框内存在目标时,置信度应该置为该预测边界框和真值框的IoU(Intersection over Union,交并比)。

每个网格还会预测C个条件类别概率值,它表示当有目标的中心位置“落入”该网格中时,这一目标属于C个类别的概率分布。

网络结构设计

 YOLOv1的网络结构很简单,借鉴了GooLeNet设计,共包含24个卷积层,2个全链接层(前20层中用1×1 reduction layers 紧跟 3×3 convolutional layers 取代GooLeNet的 inception modules)。

  • 输入:448 x 448 x 3,由于网络的最后需要接入两个全连接层,全连接层需要固定尺寸的输入,故需要将输入resize。
  • Conv + FC:主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数:max(x,0.1x),最后一层采用线性激活函数。
  • 输出:最后一个FC层得到一个1470 x 1的输出,将这个输出reshap一下,得到 7 x 7 x 30 的一个tensor,即最终每个单元格都有一个30维的输出,代表预测结果。

YOLO输入图像的尺寸为448 × 448,经过24个卷积层和2个全连接层,最后在reshape操作,输出的特征图大小为7 × 7 × 30,那这个值是怎么得出来的呢?

实际上输出的是S \times S\times(5 \times B+C)的tensor张量,刚刚也说了要有B个预测框,每个预测框包括了5个信息[x,y,w,h,c],C表示分类预测(通常是20类左右)。

  • SxS为7x7网格
  • B=2,也就是每个格子有2个预测框
  • C=20,PASCAL VOC数据集有20个分类

损失函数

位置误差

主要是计算bbox的(x,y,w,h)和对应的ground truth box的(x,y,w,h)之间的sum-squared error,需要注意的是并不是所有的bbox都参与loss的计算,首先必须是第i个单元格中存在object,并且该单元格中的第j个bbox和ground truth box有最大的IoU值,那么这个bbox才参与loss的计算,其他的不满足条件的bbox不参与。此外,因为误差在小的box上体现的更明显,就是一点点小的位置上的偏差可能对大的box影响不是很大,但是对小的box的影响就比较明显了,所以为了给不同size的box的位置loss赋予不同的‘权重’,需要对w和h开方后才进行计算。

我们知道y=\sqrt{x},当x较小时,x的一点小的变化都会导致y大的变化,而当x较大的时候,x的一点儿小的变化不会让y的变化太大。这个方法只能减弱这个问题,并不能彻底解决这个问题。

置信度误差

置信度分成了两部分,一部分是包含物体时置信度的损失,一个是不包含物体时置信度的值。其中前一项表示有无人工标记的物体落入网格内,如果有,则为1,否则为0。第二项代表预测框box和真实标记的box之间的IoU。值越大则box越接近真实位置。

分类误差

当作回归误差来计算,使用sum-squared error来计算分类误差,需要注意的是只有包含object的单元格才参与分类loss的计算,即有object中心点落入的单元格才进行分类loss的计算,而这个单元格的ground truth label就是该物体的label。

总的来说就是:

对于有目标的单元格(cell):

  1. 计算单元格的分类误差,即目标类别的预测误差。
  2. 计算单元格中两个边界框(bbox)的置信度误差,即预测的边界框是否包含目标的置信度误差。
  3. 找到与单元格中的ground truth box(真实边界框)具有最大IoU的边界框,并计算其位置误差,即边界框的坐标和尺寸误差。

对于没有目标的单元格:

  1. 仅计算单元格中两个边界框的置信度误差,因为没有目标存在。

这个目标检测过程中的误差计算主要用于训练过程中的损失函数计算,以便通过反向传播来更新模型的参数,使其能够更好地预测目标的位置和类别。

YOLOv1算法的缺点

YOLOv1算法存在一些缺陷,这些缺陷在原文中进行了讨论。

  1. 目标数量限制:YOLOv1每个网格只能预测2个边界框和1个类别。这限制了对于相近目标的检测数量,尤其是在包含大量小物体的场景中(如鸟群)。这可能导致YOLOv1在这些情况下的检测结果不够准确。

  2. 泛化能力有限:由于YOLOv1是通过从数据中学习来进行目标检测的,它的泛化能力可能受到一些限制。特别是在面对具有不寻常长宽比或配置的目标时,模型可能无法很好地适应。这可能导致YOLOv1在这些情况下的检测性能下降。

  3. 损失函数设计:YOLOv1使用的损失函数在一些方面可能不够合理,特别是在处理定位误差和大小物体时。由于YOLOv1将边界框的位置和大小信息与类别预测结合在一起进行训练,误差的影响可能不够平衡,尤其是对于小物体的处理。这可能导致YOLOv1在定位小物体时的性能较差。

这些缺陷是YOLOv1算法的一些局限性,随后的YOLO版本(如YOLOv2、YOLOv3等)对这些问题进行了改进和优化,以提高检测性能和泛化能力。

参考文章

【0】 You Only Look Once: Unified, Real-Time Object Detection

【1】【目标检测】YOLO系列——YOLOv1详解_yolov1网络结构图详解_本初-ben的博客-CSDN博客

【2】 yolov1详解_Fighting_1997的博客-CSDN博客 

【3】【目标检测论文阅读】YOLOv1 - 知乎 (zhihu.com)

【4】 搞懂YOLO v1看这篇就够了_yolov1_Antrn的博客-CSDN博客

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

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

相关文章

React 18 对 state 进行保留和重置

参考文章 对 state 进行保留和重置 各个组件的 state 是各自独立的。根据组件在 UI 树中的位置,React 可以跟踪哪些 state 属于哪个组件。可以控制在重新渲染过程中何时对 state 进行保留和重置。 UI 树 浏览器使用许多树形结构来为 UI 建立模型。DOM 用于表示 …

3DCAT携手华为,打造XR虚拟仿真实训实时云渲染解决方案

2023年5月8日-9日,以 因聚而生 众志有为 为主题的 华为中国合作伙伴大会2023 在深圳国际会展中心隆重举行。本次大会汇聚了ICT产业界的广大新老伙伴朋友,共同探讨数字化转型的新机遇,共享数字化未来的新成果。 华为中国合作伙伴大会2023现场&…

Python小知识 - 使用Python进行数据分析

使用Python进行数据分析 数据分析简介 数据分析,又称为信息分析,是指对数据进行综合处理、归纳提炼、概括总结的过程,是数据处理的第一步。 数据分析的目的是了解数据的内在规律,为数据挖掘,并应用于商业决策、科学研究…

04ShardingSphere-JDBC垂直分片

1、准备服务器 比如商城项目中,有用户、订单等系统,数据库在设计时用户信息与订单信息在同一表中。这里创建用户服务、订单服务实现数据库的用户信息和订单信息垂直分片 服务器规划:使用docker方式创建如下容器 服务器:容器名se…

P13 VUE 二级menu实现

主要修改以下几个点&#xff1a; CommonAside.vue中 外层便利有孩子节点&#xff0c;关键词key是对应的标签&#xff0c;class动态图表渲染 内层遍历不能再用item&#xff0c;用subitem&#xff0c;遍历该item.childeren&#xff0c;关键词是path&#xff0c; <templat…

java 批量下载将多个文件(minio中存储)压缩成一个zip包

我的需求是将minio中存储的文件按照查询条件查询出来统一压成一个zip包然后下载下来。 思路&#xff1a;针对这个需求&#xff0c;其实可以有多个思路&#xff0c;不过也大同小异&#xff0c;一般都是后端返回流文件前端再处理下载&#xff0c;也有少数是压缩成zip包之后直接给…

【C++设计模式】详解装饰模式

2023年8月31日&#xff0c;周四上午 这是我目前碰到的最难的设计模式..... 非常难以理解而且比较灵活多半&#xff0c;学得贼难受&#xff0c;写得贼费劲..... 2023年8月31日&#xff0c;周四晚上19:48 终于写完了&#xff0c;花了一天的时间来学习装饰模式和写这篇博客。 …

《Kubernetes部署篇:Ubuntu20.04基于二进制安装安装kubeadm、kubelet和kubectl》

一、背景 由于客户网络处于专网环境下&#xff0c; 使用kubeadm工具安装K8S集群&#xff0c;由于无法连通互联网&#xff0c;所有无法使用apt工具安装kubeadm、kubelet、kubectl&#xff0c;当然你也可以使用apt-get工具在一台能够连通互联网环境的服务器上下载kubeadm、kubele…

说说Kappa架构

分析&回答 对于实时数仓而言&#xff0c;Lmabda架构有很明显的不足&#xff0c;首先同时维护两套系统&#xff0c;资源占用率高&#xff0c;其次这两套系统的数据处理逻辑相同&#xff0c;代码重复开发。 能否有一种架构&#xff0c;只需要维护一套系统&#xff0c;就可以…

【核磁共振成像】相位差重建

目录 一、相位差map重建一般步骤和反正切函数主值范围二、反正切运算三、可预期相位误差和伴随场的校正四、图形变形校正 一、相位差map重建一般步骤和反正切函数主值范围 MRI是一个相敏成像模态&#xff0c;MR原始数据傅里叶变换后的复数图像中每个像素值有模和相位。标准模重…

HTML5

写在前面 一、开个头 安装vscode 1.1 什么是网页 网站是指因特网上根据一定的规则&#xff0c;使用HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是HTML格式的文件&#xff0c;它要通过浏览器来阅读。 网页是构成网站的基本元素…

uniapp 微信小程序 锚点跳转

uniapp文档 以下是我遇到的业务场景&#xff0c;是点击商品分类的某一类 然后页面滚动至目标分类&#xff0c; 首先第一步是设置锚点跳转的目的地&#xff0c;在目标的dom上面添加id属性 然后给每个分类每一项添加点击事件&#xff0c;分类这里的item数据里面有一字段是和上…

OpenCV(三):Mat类数据的读取

目录 1.Mat类矩阵的常用属性 2.Mat元素的读取 1.at方法读取Mat矩阵元素 at (int row,int col) 2.矩阵元素地址定位方式访问元素 3.Android jni demo 1.Mat类矩阵的常用属性 下面是一些Mat类的常用属性&#xff1a; rows: 返回Mat对象的行数。 cols: 返回Mat对象的列数。 …

SpringMVC概述与简单使用

1.SpringMVC简介 SpringMVC也叫做Spring web mvc,是 Spring 框架的一部分&#xff0c;是在 Spring3.0 后发布的。 2.SpringMVC优点 1.基于 MVC 架构 基于 MVC 架构&#xff0c;功能分工明确。解耦合&#xff0c; 2.容易理解&#xff0c;上手快&#xff1b;使用简单。 就可以…

AttributeError: ‘ConfigDict‘ object has no attribute ‘log_level‘

运行 python tools/train.py configs/pspnet/pspnet_r50-d8_512x512_80k_ade20k.py 时出现 问题 Traceback (most recent call last):File "tools/train.py", line 242, in <module>main()File "tools/train.py", line 167, in mainlogger get_ro…

0基础学习VR全景平台篇 第94篇:智慧景区浏览界面介绍

一、景区详细信息介绍 点击左上角的图标就可以看到景区详细信息例如景区简介&#xff0c;地址&#xff0c;开放信息&#xff0c;联系电话等 二、问题反馈中心 点击左下角的【问题反馈】按钮向作者进行问题反馈 三、开场地图 1、直接点击开场地图页面上的图标浏览该场景 2、通…

Java流数据

流数据 可以从不同的角度对流进行分类&#xff1a; 处理的数据单位不同&#xff0c;可分为&#xff1a;字符流&#xff0c;字节流 2.数据流方向不同&#xff0c;可分为&#xff1a;输入流&#xff0c;输出流 3.功能不同&#xff0c;可分为&#xff1a;节点流&#xff0c;处理…

【golang】简单介绍下goroutine

前面的两篇&#xff0c;从相对比较简单的锁的内容入手(也是干货满满)&#xff0c;开始了go的系列。这篇开始&#xff0c;进入更核心的内容。我们知道&#xff0c;go应该是第一门在语言层面支持协程的编程语言(可能是我孤陋寡闻)&#xff0c;goroutine也完全算的上是go的门面。g…

【微服务】服务发现和管理技术框架选型调研

选型背景 方案对比 结论 结合实际业务和开发需要&#xff0c;着重考虑性能可靠性、功能和社区支持程度三方面&#xff0c;认为Nacos更适合作为服务发现和管理的技术框架。具体理由如下&#xff1a; 性能更好&#xff0c;可靠性更高 经过阿里、APISIX、SpringCloudAlibaba,阿…

opencv案例06-基于opencv图像匹配的消防通道障碍物检测与深度yolo检测的对比

基于图像匹配的消防通道障碍物检测 技术背景 消防通道是指在各种险情发生时&#xff0c;用于消防人员实施营救和被困人员疏散的通道。消防法规定任何单位和个人不得占用、堵塞、封闭消防通道。事实上&#xff0c;由于消防通道通常缺乏管理&#xff0c;导致各种垃圾&#xff0…