目标识别 YOLO 学习笔记(一)

目标检测中的解耦和耦合、anchor-free和anchor-base 耦合头适合轻量化模型和计算资源有限的情况,追求更高的效率。解耦头适合更复杂的目标检测任务,追求更高的精度。 阅读详情

文章源于我的个人博客,地址:目标识别 YOLO 学习笔记(一), 尊重原创,转载请注明。

这个笔记,主要是学习 YOLO 入门教程《How to implement a YOLO (v3) object detector from scratch in PyTorch》的笔记,其中包含自己学习过程中遇到的不懂之处的记录,其中一些英文单词并没有翻译,考虑到因为语言的差异,中文很难表达地很形象。与大家分享,以交流共勉。

笔记也会分为5个部分,层层递进,使用 PyTorch实现 YOLO (v3)。 完整的内容可参考原教程,在这里对教程的作者表示感谢。

基本YOLO知识

YOLO 全称为 You Only Look Once.

YOLO 是全卷积网络,一共有75个卷积层,其中包含 skip connections 和 unsampling 层。没有使用任何池化层,使用步长为2的卷积层对特征图进行下采样(downsample), 这就避免了由于池化所带来的低阶特征消失的问题。

虽然全卷积网络对图像的输入大小并不敏感,但我们仍希望输入图像的大小是固定了,以免在实现算法的过程中出现各种问题。

这些问题中最重要的一点是,如果我们想要批量处理图像(批量生成的图像可以由GPU并行处理,从而提高速度),我们需要拥有固定高度和宽度的图像。 这需要将多个图像连接成一个大批量(将许多PyTorch张量连接成一个)

输出

在YOLO中,通过使用使用1×1卷积的卷积层来完成预测。

所以,在YOLO中,输出是一个feature map。 由于我们使用了1 x 1个卷积,因此预测map的大小正好是之前的feature map的大小。 在YOLO v3(及其后代)中,您解释此预测图的方式是每个单元格可以预测固定数量的边界框。

深度方面,我们在特征图中有$B \times (5 + C)) $个条目,其中B 代表每个cell 可以预测的边界框(bounding box)的数量,根据论文研究,每个边界框可以专门检测某种对象。每个边界框有 ( 5 + C ) (5+C) (5+C) 个属性,描述了每个边界框的中心坐标,尺寸,对象度分数和C类置信度(confidence)。YOLO v3 在每个cell中预测三个边界框。

如果对象的中心落在该cell 的感知区域中,您希望feature map的每个cell 通过其中一个边界框预测对象。

与YOLO的训练方式有关的是,只有一个边界框(bounding box)负责检测任何给定的对象,即我们要确定这个边界框属于哪个 cell。为此,我们将输入图像划分为尺寸等于最终feature map的网格。

举例来说,我们有一个 416×416 的输入图像,网络的stride 为 32, 那么我们就将图像划为 13×13 个网格,即将输入图像切割为 13×13 个 cell。

然后,选择包含对象的ground truth box的中心的单元(在输入图像上)作为负责预测对象的单元。在该例子中,红色的cell 就是包含 ground truth box (黄色框)中心的cell。

现在,红色单元格是网格中第7行第7列的单元格。我们现在将特征图上的第7行中的第7个单元(特征图上的相应单元)指定为负责检测狗的单元。

现在,这个 cell 可以预测3个 bounding box(YOLO v3 中每个cell预测3个bounding box),那么哪一个将作为狗的 ground truth label呢?

在这里插入图片描述

Anchor Boxes

预测bounding box的宽度和高度可能是有意义的,但实际上,这会导致训练期间出现不稳定的梯度。 相反,大多数现代 object detectors 预测对数空间变换(log-space transforms),或简单地偏移到预定义的称为**锚(anchor)**的default bounding box。

然后,将这些reansforms 应用于 anchor 以获得预测。 YOLO v3有三个anchor,可以预测每个单元格的三个边界框

回到我们之前的问题,负责检测狗的bounding box将是其 anchor 具有最高IoU和ground truth box的那个。

做出预测 Marking Predictions

下面的公式给出了 如何由神经网络的输出经过转换,获得 bounding box 的预测。
b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t 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} bx​=σ(tx​)+cx​by​=σ(ty​)+cy​bw​=pw​etw​bh​=ph​eth​
这里的 b x , b y , b w , b h b_x, b_y, b_w, b_h bx​,by​,bw​,bh​ 分别是预测的中心坐标,宽度和高度; t x , t y , t w , t h t_x, t_y, t_w, t_h tx​,ty​,tw​,th​ 是神经网络的输出; c x , c y c_x, c_y cx​,cy​ 是ground truth box 中的中心所在网格(grid)的左上角坐标; p w , p h p_w, p_h pw​,ph​ 是 box 的 anchor 尺寸。 σ \sigma σ代表 sigmoid 函数

中心坐标 Center Coordinas

我们使用 sigmoid 函数来寻找我们的中心坐标的预测,这样的输出值范围为 0~1,我们为什么这么做呢?

通常,YOLO不会预测 bounding box中心的绝对坐标,它预测的是偏移量:

  • 相对于预测对象的grid cell 的左上角。
  • 由feature map中的cell尺寸标准化。

例如,考虑上面的狗的图像,如果对中心的预测是(0.4, 0.7),那么这意味着中心位于13 x 13特征图上的(6.4,6.7)。(因为红色 cell 的左上角坐标是(6,6))

但是,如果预测的x,y坐标大于1,会发生什么呢?比如(1.2, 0.7), 这意味着中心位于(7.2, 6.7)。 请注意,中心现在位于我们的红色 cell 右侧的cell中,或者位于第7行的第8个cell中。 这打破了YOLO背后的理论,因为如果我们假设红色框负责预测狗,那么狗的中心必须位于红色单元格中,而不是位于旁边的单元格中。 因此,为了解决这个问题,输出通过sigmoid函数,该函数将输出压缩在0到1的范围内,有效地将中心保持在预测的网格中。

Dimension of Bounding Box

通过对输出应用 对数空间变换(log-space transform),然后乘以anchor 来预测边界框的尺寸。

预测得到的 b w , b h ​ b_w, b_h​ bw​,bh​​ 是经过图像的高度和宽度标准化的,因此,如果包含狗的bounding box 的预测bx和by是(0.3, 0.8),那么13 x 13特征图上的实际宽度和高度是(13 x 0.3,13 x 0.8)。

Objectness Score

object score 表示对象包含在边界框内的概率。 对于红色和相邻的网格,它应该接近1,而对于角落处的网格,几乎为0。 对象性得分也通过sigmoid传递,因为它被解释为概率。

Class Confidences

Class confidences (置信度)表示检测到的对象属于特定类(狗,猫,香蕉,汽车等)的概率。 在v3之前,YOLO使用 softmax的class score, 但是,该设计选择已在v3中删除,作者选择使用sigmoid。 原因是Softmaxing类得分假设类是互斥的。 简单来说,如果一个对象属于一个类,那么它就保证它不属于另一个类。 这对于我们将以检测器为基础的COCO数据库来说是正确的。 但是,当我们有像女人和人一样的课程时,这种假设可能不会成立。 这就是作者避免使用Softmax 的原因。

Prediction across different scales.

YOLO v3通过3种不同的尺度进行预测。 检测层用于在三种不同尺寸的特征图上进行检测,分别具有步幅32,16,8。 这意味着,在输入为416 x 416的情况下,我们在13 x 13,26 x 26和52 x 52尺寸上进行检测。

网络对输入图像进行下采样,直到第一个检测层为止,其中使用具有步幅32的layer的feature maps 进行检测。 此外,对层进行2倍上采样,并与具有相同feature map尺寸的先前层的feature map连接。在具有步幅16的层处进行另一检测。重复相同的上采样过程,并且在步幅8的层处进行最终检测。在每个比例下,每个单元使用3个anchor来预测3个bounding box,使得使用的 anthor总数为9.(不同尺度的anchor不同)

Output Processing

对于一个输入为 416×416 的图像,YOLO检测到 ( 52 × 52 + 26 × 26 + 13 × 13 ) × 3 = 10647 (52 \times 52 + 26 \times 26 + 13 \times 13) \times 3 = 10647 (52×52+26×26+13×13)×3=10647 个 bounding box, 但是对于我们的例子,图像中只有一个需要检测的对象,那么如何从 10467 得到 1 呢?

Thresholding by Object Confidence

通过对象置信度进行阈值处理。

首先,我们根据 objectness score 过滤boxes,通常,忽略具有低于阈值分数的box。

Non-maximum Suppression

NMS旨在解决同一图像的多次检测问题,这时可以使用 NMS 算法获取其中最好的一个 box。

新名词学习

Receptive field

1. 是什么

中文可以译为 “感受野”。(个人感觉译过来并不好,直接使用英文就好)

The receptive field is defined as the region in the input space that a particular CNN’s feature is looking at.

在卷积神经网络中,receptive map 的定义是:卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。

在机器视觉领域的深度神经网络中的 receptive field,用来表示网络内部的不同位置的神经元对原图像的感受范围的大小。

所以,总结来看,receptive field 就是输入图像对某一层输出神经元的影响有多大。

2. Receptive Field 计算公式

从第一层卷积层,层层迭代,计算RF
R F N = ( R F N − 1 − 1 ) ∗ s t r i d e + k e r n e l RF_{N} = (RF_{N-1} - 1) * stride + kernel RFN​=(RFN−1​−1)∗stride+kernel
其中 R F N − 1 RF_{N-1} RFN−1​ 表示第(N-1)层神经网络的 RF, R F N RF_N RFN​ 表示第 N 层 的RF,stride 表示由 (N-1) 层到 (N) 层的卷积步长,kernel表示卷积核大小。

注意:卷积神经网络的第一个卷积层的 RF 就是卷积核大小,因为它的一个像素点,代表了上一层的 kernel 个像素点的特征,这就是RF 的含义。

3. 举例

举一个例子,原始图像为 5 × 5 5 \times 5 5×5,卷积核(Kernel Size)为 3 × 3 3 \times 3 3×3 ,padding 为 1   t i m e s 1 1 \ times 1 1 times1,stride为 2 × 2 2 \times 2 2×2,依照此卷积规则,连续做两次卷积,则第一次卷积结果是 3 × 3 3 \times 3 3×3的feature map,第二次卷积结果是 2 × 2 2 \times 2 2×2 大小的feature map。

则第一层卷积结束后,RF 为 3 × 3 ​ 3 \times 3​ 3×3​; 第二层卷积结束后,RF 大小为 ( 3 − 1 ) ∗ 2 + 3 = 7 ​ (3-1)*2+3 = 7​ (3−1)∗2+3=7​

4. 检验RF

下面这个网站提供了 RF 的一键计算功能。

FOMORO AI

三个高级工程师搞的网站,可以简单的输入网络参数,就直接把你的感受野计算出来。界面如下。

IoU (Intersection over Union)

IoU 用来表征在目标检测中,预测的 bounding box 和 ground truth 的bounding box 的重合程度。

待学习的知识

  • skip connections是什么
  • 上采样和下采样(unsample, downsample)是什么
    • 空间池化(spatial Pooling),也称为子采样(subsampling)或下采样(downsampling),其减少了每一个特征映射的维度,但是保留了最重要的信息。
  • bounding box regression是什么
30分钟搞定YOLO目标识别 《YOLO目标检测入门实战教程:从零到识别只需1小时》 本教程为YOLO新手提供一站式解决方案,通过傻瓜式操作指南帮助快速掌握目标检测技术。核心内容包括: 版本选择指南 YOLOv5s:新手首选,社区资源丰富 YOLOv8n:支持目标轮廓标注 YOLOv10:实时检测性能提升40% 环境搭建(Windows/Linux通用) 详细讲解Anaconda环境配置 提供GPU/CPU两种PyTorch安装方案 包含环境验证方法 实战应用教学 现成模型使用:图片/视频/摄像头检测 自定义训练:从数据标注到模型训练全 阅读详情

相关推荐

985专家讲AI多模态大模型原理:目标识别算法YOLO

本文详细介绍了YOLO(You Only Look Once)目标检测算法的技术原理和发展历程。作为当前最成功的AI算法之一,YOLO采用单阶段检测方法,通过将图像划分为网格单元并预测边界框,实现了高效精准的实时目标识别。文章重点解析了YOLO1的算法架构:448×448图像通过卷积神经网络下采样为7×7×30张量,包含网格单元、边界框和类别概率信息,并通过非极大值抑制得到最终检测结果。相比传统的两阶段检测方法,YOLO具有端到端训练、处理速度快等优势,广泛应用于自动驾驶、无人机跟踪等领域。

Gupao123的博客 1248

深度学习物体检测详解:YOLO V3

YOLO V3: An Incremental ImprovementImprovements:1. Objectness score:YOLO V3用logistic regression为每一个bbox预测一个objectness score。假如一个bbox与ground truth的IOU比其他bboxes的都要大,则它的objectness score为1,即为best box。假如一个...

Enjoy Coding 5326

YOLO模型详解

YOLO(You Only Look Once)是一种快速高效的单阶段目标检测算法,通过将图像划分为网格单元同时预测目标位置和类别,实现了实时检测。尽管YOLO以速度和准确性著称,但其在自动驾驶领域并未成为主流方案,主要原因包括:定位精度不足,特别是对小目标和远距离物体的检测效果较差;计算资源限制和模型复杂度增加;以及自动驾驶系统需要融合多种算法来完成复杂任务。尽管如此,YOLO仍在特定场景如近距离目标检测中发挥重要作用。随着技术发展,YOLO系列持续优化,但需平衡速度与精度以适应不同应用需求。

Gupao123的博客 5493

YOLO框架简述

YOLO(You Only Look Once)是一种基于深度神经网络的对象识别和定位算法,其最大的特点是运行速度很快,可以用于实时系统。现在YOLO已经发展到v3版本,不过新版本也是在原有版本基础上不断改进演化的,所以本文先分析YOLO v1版本。 输入一张图片,要求输出其中所包含的对象,以及每个对象的位置(包含该对象的矩形框)。 对象识别和定位...

知识搬运工的博客 15万+

C++实现YOLO目标识别图像预处理、后处理

基于C++手写YOLO目标识别图像后处理部分代码

weixin_39538031的博客 2290

ROS+yolo目标识别(有单独拍照程序)+测距+简单避障

ROS+yolo目标识别(有单独拍照程序,保存图片到指定位置,以便运行YOLO识别)+测距+简单避障

m0_66920337的博客 2264

yolo系列之yolo v3【深度解析】

yolo_v3是我最近一段时间主攻的算法,写下博客,以作分享交流。 看过yolov3论文的应该都知道,这篇论文写得很随意,很多亮点都被作者都是草草描述。很多骚年入手yolo算法都是从v3才开始,这是不可能掌握yolo精髓的,因为v3很多东西是保留v2甚至v1的东西,而且v3的论文写得很随心。想深入了解yolo_v3算法,必须先了解v1和v2。以下是我关于v1和v2算法解析所写的文章: v1算法...

木盏 50万+

yolo树莓派_AI-目标识别入门(YOLO算法)

1.首先换源教程地址:https://www.jianshu.com/p/768f0181672bdarknet-nnpack由于github上git代码特别慢,网上有个教程:https://blog.youkuaiyun.com/weixin_37910453/article/details/86655613构建步骤:sudo apt-get install python-pipsudo pip insta...

weixin_34804678的博客 1183

目标检测(一)--Objectness算法总体理解,整理及总结

1.源码下载及转换为VS2012 WIN32版本。 http://www.cnblogs.com/larch18/p/4560690.html

工作笔记 1万+

目标识别项目实战:基于Yolov7-LPRNet的动态车牌目标识别算法模型

目标识别如今以及迭代了这么多年,普遍受大家认可和欢迎的目标识别框架就是YOLO了。按照官方描述,YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。从基本的YOLOv1版本到如今v8版本,完成了多次蜕变,现在已经相当成熟并且十分的亲民。我见过很多初学目标识别的同学基本上只花一周时间就可以参照案例实现一个目标检测的项目,这全靠YOLO强大的解耦性和部署简易性。初学者甚至只需要修改部分超参数接口,调整数据集就可以实现目标检测了。

master_hunter的博客 6361

目标识别项目实战:基于Yolov7-LPRNet的动态车牌目标识别算法模型(二)

目标识别如今以及迭代了这么多年,普遍受大家认可和欢迎的目标识别框架就是YOLO了。按照官方描述,YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。从基本的YOLOv1版本到如今v8版本,完成了多次蜕变,现在已经相当成熟并且十分的亲民。我见过很多初学目标识别的同学基本上只花一周时间就可以参照案例实现一个目标检测的项目,这全靠YOLO强大的解耦性和部署简易性。初学者甚至只需要修改部分超参数接口,调整数据集就可以实现目标检测了。

master_hunter的博客 7395

(一)YOLO目标识别模型 ——Darknet53网络结构

(一)YOLO目标识别模型 ——Darknet53网络结构 参考 本文链接: https://blog.youkuaiyun.com/leiduifan6944/article/details/104857968 文章目录参考前言一、YOLO的主要骨架二、介绍1.创建卷积块2.创建残差单元2.按照上面结构图写出Darknet53网络结构总结 前言 YOLO算法的出现,将回归思想引入目标识别处理过程,最终直接输出物体的位置、置信度和类别信息。YOLOv3在结构中模块与模块的衔接采用张量拼接,不同于残差层的

jieke2020的博客 4222

手把手教你用EG2153搭建开关电源:SOP-8封装驱动芯片的5个设计技巧

本文详细介绍了使用EG2153自振荡半桥驱动芯片搭建开关电源的五个核心设计技巧。内容涵盖从深入理解芯片工作机制、频率编程计算误区、SOP-8封装的热管理方案,到死区时间评估与外部保护电路设计,以及实战调试与故障排查指南,旨在帮助工程师实现稳定可靠的小功率电源设计。

weixin_29200485的博客 376

学习记录01:使用pyqt5搭建yolo3目标识别界面

使用pyqt5搭建yolo3目标识别界面 由于这是我第一次写这种博客,其目的也不是为了赚取积分,主要是为了记录我的学习过程中的一些方法,以便以后我再次需要用的时候可以知道我当时是怎么做的。所以文中会有很多地方并不会解释其原理,主要着重于怎么运用。如有不当之处,请指出我当改正。

我的鱼呀的博客 1万+

Rocky Linux 9 离线环境Docker部署实战:从依赖打包到服务启动

本文提供了一份详尽的Rocky Linux 9离线环境Docker部署实战指南。针对无法访问外网的生产或内网服务器,文章详细讲解了如何在联网跳板机上下载Docker二进制包及所有系统依赖RPM包,并完成打包。随后,手把手指导在离线服务器上进行依赖安装、二进制文件部署、systemd服务配置、SELinux与防火墙调优,最终实现Docker服务的成功启动与验证。

weixin_28363123的博客 138

告别色差!用Python+TCS34725颜色传感器实现精准色彩还原(附完整校准代码)

本文详细介绍了如何利用Python和TCS34725颜色传感器实现专业级色彩还原方案。通过双阶校准法(白光校准和黑电平校准)和进阶的光照自适应技术,解决传感器原始数据不准的问题,并提供完整的校准代码和实战案例,帮助开发者实现ΔE<3的高精度色彩识别。

weixin_30836759的博客 209

yolo目标识别数据集

在目标识别领域,在机器学习和计算机视觉中,使用 YOLO(You Only Look Once)模型进行目标检测是一种常见的方法。为了使用 YOLO 进行目标识别,你需要准备一个适当的数据集。

优快云NBBN的博客 686

保姆级教程:用LoRA微调Chinese-Mistral-7B模型,并一键部署到Ollama(附完整代码)

本文提供了一份详细的LoRA微调Chinese-Mistral-7B模型的保姆级教程,涵盖环境配置、数据预处理、微调实战、模型量化及Ollama部署全流程。通过实战案例和完整代码,帮助开发者快速构建专属中文大模型,适用于医疗、法律等垂直领域。

weixin_30369041的博客 249

当前主流目标识别(Object Detection)算法

目标识别(Object Detection)就是从图像/视频之中识别出用户感兴趣的目标,反馈目标的位置和类别。目前主流的目标识别技术方案包括R-CNN,YOLO,SSD等

星光 1万+

Hypermesh静力学仿真分析与模态分析-02

hypermesh中对较复杂实体进行静力学分析和模态分析,包含材料属性添加,载荷设置等等

Look_forward_的博客 6775

TCN实战:用Python手把手搭建时序预测模型(附完整代码)

本文详细介绍了如何使用Python搭建TCN(Temporal Convolutional Network)时序预测模型,包括数据预处理、模型架构实现、训练调优及预测评估。通过完整的代码示例和实用技巧,帮助开发者快速掌握TCN在时间序列预测中的应用,特别适合处理长期依赖问题。

weixin_29041195的博客 372

【PaddlePaddle】使用Tiny-Yolo做“垃圾图像”目标识别

PaddlePaddle实战-使用YoloV3做“垃圾图像”目标识别

weixin_42581931的博客 3242

3D深度饼图的QT实现

首先,我们需要创建一个QT项目并创建一个窗口,用于显示我们的饼图。在QT Creator中,选择创建一个新的QT Widgets应用程序项目,并创建一个新的窗口类。在本文中,我将介绍如何使用QT实现一个3D深度饼图(Pie 3D)的可视化效果。在构造函数中,我们将创建一个饼图(QChartView)并设置饼图的数据。这是一个简单的示例,您可以根据需要自定义和扩展代码来创建更复杂的饼图。现在,我们已经完成了3D深度饼图的QT实现。您将看到一个具有相应数据的3D深度饼图显示在窗口中。3D深度饼图的QT实现。

CodeJolt的博客 277

目标识别 -- YOLO部署安卓平台

详细可查看此文章。需注意CUDA和CUDNN版本的兼容。

B_K2_0_1的博客 2290

单片机通过蜂鸣器播放任意音乐代码实现(2):音乐单片机代码自动生成

单片机通过蜂鸣器播放任意音乐代码实现(2):音乐单片机代码自动生成 上一节我们已经构建了基于51单片机的蜂鸣器音乐播放环境,接下来只需要手动或者自动添加音乐代码便能实现不同音乐的播放。当然,第二节将告诉你如何自动生成这些音乐代码。 所用软件 MuseScore 3;用于转换MID文件为musicxml文件 C/C++ IDE(本文为Visual Studio 2019) 1.生成音乐对应的MID文件 可以直接下载mid格式音乐文件,也可以将某段音乐转换为MID文件。最好是直接使用mid格式音乐文件,可

kevin1499的博客 2万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

在Jetson Nano安装测试YOLO v5目标识别示例

在Jetson Nano上搭建一个YOLO v5示例

星光 2389

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Pycharm连接远程服务器并实现远程调试
下一篇: 目标识别 YOLO 学习笔记(二)
庸木
博客等级 码龄8年 19粉丝 11原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值