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

学习资源

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

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.rhkb.cn/news/119740.html

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

相关文章

比较opencv,pillow,matplotlib,skimage读取图像的速度比

上面这些库都被广泛用于图像处理和计算机视觉任务; 不同的图像读取库(OpenCV,Pillow,matplotlib和skimage)的读取速度,是怎么样的一个情况? 下面分别从读取速度,以及转换到RGB通道…

Linux环境基础开发工具

xshellssh xshell--充当客户端,提供远程登录服务 yum 背景知识 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放…

Llama模型结构解析(源码阅读)

目录 1. LlamaModel整体结构流程图2. LlamaRMSNorm3. LlamaMLP4. LlamaRotaryEmbedding 参考资料: https://zhuanlan.zhihu.com/p/636784644 https://spaces.ac.cn/archives/8265 ——《Transformer升级之路:2、博采众长的旋转式位置编码》 前言&#x…

设计模式入门(二)观察者模式

设计模式入门 本系列所有内容参考自《HeadFirst设计模式》。因为书中的代码是采用java语言写的,博主这里用C语言改写。 这里采用讲故事的方式进行讲解。若有错误之处,非常欢迎大家指导。 设计模式:模式不是代码,而针对设计问题的…

深入理解作用域、作用域链和闭包

​ 🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! ​ 目录 📚 前言 📘 1. 词法作用域 📖 1.2 示例 📖 1.3 词法作用域的…

Python学习教程:进程的调度

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 要想多个进程交替运行,操作系统必须对这些进程进行调度, 这个调度也不是随即进行的,而是需要遵循一定的法则,由此就有了进程的调度算法。 python更多源码/资料/解答/教程等 …

iOS练手项目知识点汇总

基础理解篇 Objective-C是一种面向对象的编程语言,它支持元编程。元编程是指编写程序来生成或操纵其他程序的技术。 Objective-C中,元编程可以使用Objective-C的动态特性来实现。例如可以使用Objective-C的运行时函数来动态地创建类、添加属性和方法等等…

NPM 常用命令(二)

目录 1、npm bugs 1.1 配置 browser registry 2、npm cache 2.1 概要 2.2 详情 2.3 关于缓存设计的说明 2.4 配置 cache 3、 npm ci 3.1 描述 3.2 配置 install-strategy legacy-bundling global-style omit strict-peer-deps foreground-scripts ignore-s…

Doris workload group实战

1.创建测试用户:创建一个用户名为test,密码为test 的用户: create user test% IDENTIFIED BY test;给测试用户赋权:给用户test赋予数据库test.* 权限 grant SELECT_PRIV,LOAD_PRIV,CREATE_PRIV,ALTER_PRIV ON test.* TO test;开…

AIoT+5G改变智慧城市:揭秘智慧公厕的奇妙魅力

AIoT5G的新型智慧城市应用带来了智慧公厕的全新体验。通过智能监测、高速网络、智能调控、智慧管理等技术应用,公厕的舒适性、便捷性和智慧化程度得到了极大提升。可以看到的是,智慧公厕正逐渐激活智慧城市的生活场景,为城市居民带来更好的生…

UmeTrack: Unified multi-view end-to-end hand tracking for VR 复现踩坑记录

在 github 上找到了开源代码:https://github.com/facebookresearch/UmeTrack/tree/main 环境配置 运行第三行,报错,缺少torch。改成先运行第四行,成功。 再运行第三行,报错,required to install pyproj…

RHCE——十七、文本搜索工具-grep、正则表达式

RHCE 一、文本搜索工具--grep1、作用2、格式3、参数4、注意5、示例5.1 操作对象文件:/etc/passwd5.2 grep过滤命令示例 二、正则表达式1、概念2、基本正则表达式2.1 常见元字符2.2 POSIX字符类2.3 示例 3、扩展正则表达式3.1 概念3.2 示例 三、作业1、作业一2、作业…

Redis一主一从Docker方式部署通过keepalived和 sentinel哨兵模式实现高可用

有两台服务器一台是主,master : 172.24.69.180 另外一台是从, slave :172.24.69.181 vip 地址: 172.24.69.185 1、关闭防火墙 两台服务器都关闭防火墙 systemctl disable --now firewalld firewall-cmd --state关闭SELinux setenforce 0 …

uniapp-秋云图表 ucharts echarts 对比与关系

科普: 秋云图表库,包含二种配置属性对应二种js配置文件。 一种是 :echarts.js,一种是 : ucharts。 二者的配置属性不一样! ucharts和echarts对比 ucharts和echarts都是用于数据可视化的开源JavaScript库,它…

考研408 | 【操作系统】终章

I/O设备的基本概念和分类 I/O设备: I/O设备的分类 1.按使用特性: 2.按传输速率分类: 3.按信息交换的单位分类: 总结: I/O控制器 I/O设备的机械部件: I/O设备的电子部件(I/O控制器&#…

工程师是怎样对待开源

工程师如何对待开源 本文是笔者作为一个在知名科技企业内从事开源相关工作超过 20 年的工程师,亲身经历或者亲眼目睹很多工程师对待开源软件的优秀实践,也看到了很多 Bad Cases,所以想把自己的一些心得体会写在这里,供工程师进行…

Python八大排序实现方法

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片 1.基数排序 基数排序的基本思想是先将数字按照个位数上数字的大小进行排序, 排序之后再将已经排过序的数字再按照十位数上数字的大小进行排序,依次推…

使用acme,自动续签免费的SSL,无忧http升级https

使用acme自动续签免费的SSL 安装acme.sh颁发域名将证书安装到nginx下配置nginx的ssl自动续签 这里只进行最简单的操作 安装acme.sh 进入你的用户目录,如果你使用root登陆,那么你的用户目录就是 /root/ curl https://get.acme.sh | sh -s emailmyexam…

Python所有方向的学习路线图!!

学习路线图上面写的是某个方向建议学习和掌握的知识点汇总,举个例子,如果你要学习爬虫,那么你就去学Python爬虫学习路线图上面的知识点,这样学下来之后,你的知识体系是比较全面的,比起在网上找到什么就学什…

Silicon Labs BG22、xG24、BG27无线SoC比较及信驰达无线模块选型指南

作为安全、智能无线技术领域的前沿品牌,全球知名IC设计公司——Silicon Labs,在最近几年陆续推出了EFR32BG22、EFR32xG24、EFR32BG27等系列无线SoC。RF-star作为物联网行业领先的无线通信模组厂商,基于Silicon Labs的无线SoC推出了RF-BM-BG22…