写给自己看的yolo 3

YOLO v3算法笔记 论文:YOLOv3: An Incremental Improvement 论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf YOLO系列的目标检测算法真的非常赞!这篇博客就来介绍YOLO v3算法的内容,因为涉及到v1和v2的一些思想,所以可以先熟悉下:YOLO v1算法详解,YOLO v2算法详解。 YOLO算法的基本思想是:... 阅读详情

一、Yolo 3 简介

Yolo 3 【1】是一款2018年推出的简单、高效的目标检测算法,它仅用卷积层,实现了一个全卷积网络(Fully Convolutional Network,FCN)。在它的整个设计和实现中,体现了许多深度学习概念和技巧,是一个很值得学习的、小而全的样例。为此,我写了一个小结,方便自己以后可以经常学习和复习。

二、 Yolo 3 的实现

Yolo 3的结构如下图:
在这里插入图片描述
图1、Yolo 3 的模型结构,摘自【3】(该图用Netron作出)

其实现结构,大致可以分为3个部分:

  1. 特征提取网络(backbone)——Darknet-53
  2. 跨尺度目标提取网络——特征金字塔结构
  3. 输出检测部分——predict的FCN输出结构

2.1 特征提取 Backbone

Yolo 3的特征提取部分采用Darknet-53,由于它在做downsample时,没有采用pooling方法,而是采用了抽取卷积(stride=2) 的方法,有效抑制了底层信息的丢失。在yolo 3方案中,它总共做了5次stride,原图为416416,经过5次stride后最终输出的特征map只有1313,如下图:
在这里插入图片描述
图2 Darknet-53【1】
Yolo 3将最后的Avgpool和后续分类用的层去掉,只保留了前面的网络,在训练时,可以直接利原来作为分类时训练好的网络作为初始值,这样可大大提高训练效率。

在图2中,用红色框起来的部分就是stride=2的抽取部分,一共有五次,得到了不同尺度的特征图,在后面进行对象检测时,用了倒数三个尺度:1313,2626和52*52。

Yolo 3对Yolo 1和Yolo 2的改进地方还有采用了ResNet结构,即在不同层之间有跨接的skip channels。这种被称为残余网络的结构,就是将前层的特征通过skip channel直接馈送至后层,与后层输出相加,形成最终的模块输出,如图1的绿色模块。在绿色模块中,有数字,如:Res1、Res4,这表示该模块重复了几次,每个Res模块在图1均有结构图示。据称,这样的结构可以减少中间层对信息的损耗,使深度网络在多层迭代时,不至于出现网络衰退的情况(所谓网络衰退指的是,因为网络层数的增加而导致的网络性能下降的情况),因而当前许多深度网络均采用ResNet思想。

另外,Yolo 3在backbone改进上还采用了BN,即批处理归一化(BatchNormal)。BN放在Conv与ReLU之间,用于调整Conv输出的feature数值。由于ReLU的特征函数在0处有一个阈值,小于0的值被直接抹去,而大于0的值被一成不变地保留下来,由此实现神经元激励函数的非线性。我们考虑两个极端情况,若Conv输出的值都大于0,或都小于0,则ReLU则完全失去其作用,因而,我们对Conv的输出是需要关注的。BN就是这样一个方法,将其输出值进行了归一化,使其对称地分布在0的两侧,从而达到提高ReLU性能的目的。(如果用三极管放大电路来理解之,其实很容易,一方面要调整直流偏置,另一方面约束输入信号的幅度,这便是BN的目的。)
另外我想,在此还可以加入谱正则,以约束Conv的权重矩阵的取值,使网络的泛化能力更强,不过,这个我还没有测试过。

2.2 特征金字塔(feature pyramid networks)

特征金字塔是有【4】提出来的一个用于多尺度目标检测模型,其结构如图:
在这里插入图片描述
图3 特征金字塔,摘自【4】
由图3,可以看到predict是对不同尺度Feature map进行的,具体在YOLO 3中,这样的Feature map尺度分别为1313、2626、5252。图3所示的特征金字塔结构,其实可以在图1中找到,就是图1中间“DBL+上采样+Concat”部分。其中,尺度为1313的Feature map是Darknet-53顶层输出,它主要用于检测大尺度目标;它经过upsample后加到2626 Feature map上,这个复合Feature map不仅具有了顶层信息,还有更丰富的底层信息,非常适合用于检测中间尺度目标;最后,汇合了顶层和中层信息的 Feature map再一次upsample,形成了5252特征图,它与Backbone的52*52特征图相加,形成了用于predict小目标的Feature map。
整个过程就如同爬了一次金字塔,然后再下来,前者是逐步提取全局特征,提炼抽象信息的过程;后者则相反,将顶层的全局信息逐层扩散到下层,下层的检测也可以利用顶层的抽象全局信息,真是做到了信息一点也不浪费,其思想真当好好记留。

2.3 输出检测部分——FCN

在【1】中,主要篇幅都是用于此,可见输出部分其设计作者是很花了一定心思的。
由上面叙述,我们已经知道最后用于目标检测的特征图分别为1313、2626和5252,而检测的输出是:1313B85、 2626B85、5252B85。其中,B是每个点阵的点能检测的目标数量,85维是由4个坐标维,加一个objectness score维,再加80个分类score维所构成的。
Yolo 3之所以被称为是FCN,是因为其输出predict是基于阵列的矢量输出,或者这样说吧,它输出是一个阵列,与输入原图位置相关的一个阵列,阵列的每一个点是一个矢量,如下图:
在这里插入图片描述
图4 prediction 的结构,摘自【2】
如图4,顶图是原图;中间图是用于predict的特征图,比如是顶部特征图(1313),其中每一个元素(图中的小红框)对应一个矢量;下图表示特征矢量,该矢量维度是B(4+1+c),对于Yolo 3原模型,B=3,表示每个grid可以预测3个目标,4是表示bounding box的坐标,1表示objectness score,而c=80,表示可用于80个类的分类。
在图1中,y1、y2和y3就对应这几个predictions。
再详细的解释,在各博客中,在论文里都有详细说明,尤其是【2】值得一看。

2.4 Things We Tried That Didn’t Work

在【1】中有一节称为“Things We Tried That Didn’t Work”,翻译过来就是:有些东西我们做了,但没有效果,我觉得挺有意思的,“他山之石,可以攻玉”,因此摘抄于此。
We tried lots of stuff while we were working on YOLOv3. A lot of it didn’t work. Here’s the stuff we can remember.(深度网络的实现要靠反复的实验,耗时耗力,而且不一定成功,用“炼丹”来形容它真不为过。)
1、Anchor box x, y offset predictions. We tried using the normal anchor box prediction mechanism where you predict the x, y offset as a multiple of the box width or height using a linear activation. We found this formulation decreased model stability and didn’t work very well.(用box的长、宽比例系数来作为anchor box 坐标x、y的prediction,效果不好,因此Yolo v3没有用这个归一化值,而是直接预测其偏移量,当然用了sigmoid函数,保证回归预测的数值在一定范围,我想其中原因可能是因为anchor box的类型太多,因此要回归出归一化的比例系数不太容易,而统一直接用偏移量,要简单一些。)
2、Linear x, y predictions instead of logistic. We tried using a linear activation to directly predict the x, y offset instead of the logistic activation. This led to a couple point drop in mAP.(这里应该将的是perdition时,所用的激活函数,文章中说使用线性激活函数的效果不如用logistic 激活函数,会导致mAP指标的下降。由此可见,在回归拟合的最后一步用logistic activation作为输出,可能非线性更好一些导致输出更好一些吧。)
3、Focal loss. We tried using focal loss. It dropped our mAP about 2 points. YOLOv3 may already be robust to the problem focal loss is trying to solve because it has separate objectness predictions and conditional class predictions. Thus for most examples there is no loss from the class predictions? Or something? We aren’t totally sure.(Focal loss,是在训练时动态调整sample对Loss影响的一种简单方法,即将容易判别的sample对loss贡献比重下降,不容易判别的sample提高其loss比重。Focal loss一经提出,就被广泛应用,但也不是万能的灵药,至少在yolo 3处就是这样。)
4、Dual IOU thresholds and truth assignment. Faster R-CNN uses two IOU thresholds during training. If a prediction overlaps the ground truth by .7 it is as a positive example, by [.3 .7] it is ignored, less than .3 for all ground truth objects it is a negative example. We tried a similar strategy but couldn’t get good results.(因为深度学习无法用精确的数学语言来解释,所以在训练网络时无法预知哪一种方法是有效的,只能靠碰。这里讲到的Dual IOU方法,在训练时,只选用IOU大于0.7和小于0.3的samples,即能明显区别的那部分samples,太好分别的那部分( 即在区间[.3 .7] 中)ignore掉,其做法与Focal Loss思想截然相反,Focal Loss要对不太好分的加大权重,好分的减少权重。作者两种方法都试验过,发现都没有太大的效果,干脆就用 IOU=0.5 作为阈值就算了,效果反而更好。有时真的说不清,或许下一次再用,说不定就好了,真是望天打卦。)

三、小结

深度网络的结构设计给的我感觉就如同中医开药,比如:熬夜上火,就要喝凉茶,没有什么精确的数学的推导和证明,只有经验的推理,然后就是实验,行就行了,不行再换一种方法。不过有时也有一些让人眼前一亮的数学模型解释,如谱正则,如WGAN的Wasserstein距离。在这些精彩的解释后面,大都跟着一个正则或是pooling,我们似乎可以得到一个结论:多层神经网络复杂度是足够适应任务拟合需求的,比如前面的Darknet-53,在目标检测任务上已经足够,不需要再增加过多的层数,而整个算法的关键在于:如何在复杂的参数空间找的最优解,使用正则、pooling等方法是我们在寻优过程中找到的有效规则,人为地控制寻优的过程,给无约束的梯度寻优,添加约束项。这个地方应该是未来研究的重点。

另外,大部分目标检测算法,皆可以归类为FCN,比如这里的Yolo系列,以及前面一篇博客的CornerNet,其实都是利用深度网络提取特征,然后用回归拟合得到一个prediction。它们的差别只是预测的内容和含义(即矢量编码的含义),以及拟合输出矩阵的大小不同罢了。其实,在FCN的输出拟合矩阵中,其输出点阵本身就反映了二维位置信息,这是由CNN赋予它的receptive field(接受域)决定的,而其上的编码是复合的,有多种用途,我给它起了一个名字——二维编码,以区别于传统分类网络的编码,我们也给它取个名字——一维线性编码(编码本身没有二维空间属性,只是为了方便一字排开)。由此看来,在设计网络输出时,也可从输出编码角度考虑考虑:输出是不是可以设计为多维复合编码?多维编码是不是更有效率呢?

最后,推荐看看[2],该博文不仅将Yolo 3的原理讲得很透彻,而且对实现代码也有详细分析,值得推荐!


【1】 YOLOv3: An Incremental Improvement,
【2】 How to implement a YOLO (v3) object detector from scratch in PyTorch: Part 1 https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/
【3】yolo系列之yolo v3【深度解析】 https://blog.youkuaiyun.com/leviopku/article/details/82660381
【4】T.-Y. Lin, P. Dollar, R. Girshick, K. He, B. Hariharan, and S. Belongie. Feature pyramid networks for object detection. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 2117–2125, 2017. 2, 3

yolo v3 的 yolo 层计算代码解析 文章目录1. [yolo] 层2. 主要函数3. `make_yolo_layer`完成 yolo 层初始化操作4. `get_yolo_box`获得预测的边界框5. `delta_yolo_box`计算预测边界框的误差6. `delta_yolo_class`计算类别误差7. `entry_index`得到指针偏移量,即入口需要的索引8. `forward_yolo_layer`最重要的前向传... 阅读详情

相关推荐

tiny YOLO v3做缺陷检测实战

前言:接触yolo网络是在七月份,当时把yolo检测的论文以及R-CNN系列,SSD等一些论文看了一下,感觉内容很丰富,也尝试了darknet版本的实现,和yolo v3的实现,在网上也有很多关于上面两种的实现,这里就不讲了。九月份用tiny-yolo v3做了一个缺陷检测的实验,效果出乎意料,准确率和召回率“满分”!!过了三个月才想着把以前的实验总结一下,真不应该。下面从头开始说明怎么在自己的数...

庆志的小徒弟 2万+

TransUNet

TransUNet代码调试记录 bug 1.运行测试代码test.py AttributeError: “‘skip_channels’” 找到的网上有关错误的信息:skip_channels 按提示把vit_seg_modeling.py中的 skip_channels = self.config.skip_channels 改为 skip_channels = [512,256,64,16] 然后又有另一个bug: 看了一下我的目录结构,没有epoch_29.pth: 找到解决办法:Change

sinat_39385228的博客 4458

YOLO系列详解(YOLOV1-YOLOV3)

YOLO提出时由于one-stage特性,速度很快,FPS可以达到45,总体精度低于FastRCNN。遗憾的是,由于网格稀疏,对小对象预测效果较差。总的来说,为工业实时检测提供了新的思路。YOLO2在参考RCNN系列检测的前提下,自行设计了网络结果和训练优化手段,取得了不错的效果,为很多检测算法提供了新的思路。相比于YOLO2,YOLO3没有什么太突破的成果,参照ResNet加深了网络结构,使用比较流行的多尺度融合提升了小目标检测效果。

高丽大学人工智能硕士在读|专注大模型、RAG、OCR与AI工程实践 8456

TransUNet 纯Vit-B_16模型报错AttributeError: “‘skip_channels‘“

纯 ViT 没有 ResNet backbone,因此 skip feature 不存在,所以作者没加。而DecoderCup代码里无条件访问了。加一个默认 skip_channels。

ironskin的博客 157

YOLO-V1~V3经典物体检测算法介绍

YOLO-V1~V3经典物体检测算法介绍

suic009的博客 3876

YOLO v3论文详解

YOLOv3: An Incremental Improvement 声明:笔者翻译论文仅为学习研究,如有侵权请联系作者删除博文,谢谢! 源论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf 注:文字中标粗和亮色的部分为笔者认为有创新改进余地和需要注意的地方,斜体部分为笔者的一些想法,因水平所限,部分笔触可能有不实和错误之处,敬请广大读者...

dexterod的博客 8068

YOLOv3详解

前言 yolo算法是一种one-stage的目标检测算法,与two-stage最大区别在于,YOLO系列算法将图片划分成若干个网格,再基于anchor机制生成先验框,只用一步就生成检测框,这种方法大大提升了算法的预测速度,今天我们主要讲的是YOLOv4算法的主要实现过程,YOLOv4的论文于2020年发表在CVPR上,相对于YOLOv3的主要改动有以下几部分,mos.

xiahan_qian的博客 3万+

YOLO-v3

YOLO-v3(You Only Look Once v3)是YOLO系列目标检测算法的第三个版本,于2018年由Joseph Redmon和Ali Farhadi提出。YOLO-v3在YOLO-v2的基础上进行了一系列改进,进一步提高了目标检测的准确性和性能。更适合小目标检测。

weixin_68080601的博客 1098

YOLOv3原理详解(绝对通俗易懂)2021-07-01

1、YOLO框架

qq_43581224的博客 5万+

Poly-YOLO实例分割(YOLOV3改进版)

论文:https://arxiv.org/abs/2005.13243 开源代码:https://gitlab.com/irafm-ai/poly-yolo Poly-YOLO: higher speed, more precise detection and instance segmentation for YOLOv3 论文思想: 提出了一个新的YOLO版本,它扩展了带有实例分割的Poly-YOLO。Poly-YOLO建立在YOLOv3的原始思想的基础上,并消除了它的两个弱点:大量重写的标签和无效的锚

qq_27339501的博客 7770

YOLOv3目标检测算法——通俗易懂的解析

YOLOv3目标检测算法——通俗易懂的解析

chase 9966

YOLO算法好文章整理

YOLOv3原理相关介绍文章 1. 目标检测算法之ICCV2019 Gaussian YOLOv3 目标检测算法之ICCV2019 Gaussian YOLOv3 2. 深度学习目标检测系列:一文弄懂YOLO算法|附Python源码 一文弄懂YOLO算法|附Python源码 3. 写给小白的YOLO介绍(非常好的文章) 写给小白的YOLO介绍 4. 飞桨深度学习 之 YOLOv3算法 目标检测之YOLOv3算法实现上篇 5. YOLOv1到YOLOv3的演变过程及每个算法详解 YOLOv1到YOLOv

weixin_44533869的博客 335

写给初学者的YOLO目标检测 概述

目标检测(Object detection)是计算机视觉中使用的一种技术,用于识别和定位图像或视频中的对象。图像定位是指使用边界框(bounding boxes)来识别一个或多个对象的正确位置的过程,这些边界框对应于围绕对象的矩形形状。这个过程有时会与图像分类或图像识别混淆,后者旨在将图像或图像中的对象预测为类别或类别之一。下面的插图对应于上述解释的计算机视觉技术。在图像中检测到的对象是“人”。在本文中,将首先了解目标检测的优势,然后介绍最先进的目标检测算法YOLO。在第二部分中,我们将更加关注。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1万+

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

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

木盏 50万+

YOLO实践应用之搭建开发环境(Windows系统、Python 3.8、TensorFlow2.3版本)

前言 基于YOLO3进行物体检测、对象识别,先和大家分享如何搭建开发环境,会分为CPU版本、GPU版本的两种开发环境,本文会分别详细地介绍搭建环境的过程。 主要使用TensorFlow2.3、opencv-python4.4.0、Pillow、matplotlib等依赖库。 搭建环境参数 系统:Windows 编程语言:Python 3.8 深度学习框架:TensorFlow 2.3 整合开发环境:Anaconda ...

黎国溥 2万+

Codex智能体从零搭建:环境配置、代码管理与MCP扩展实战

AI智能体(Agent)作为连接大语言模型与实际应用的关键技术,通过感知、决策与执行框架,将AI能力融入具体工作流。其核心原理在于利用提示工程、上下文管理与工具调用,将自然语言指令转化为可执行操作。在软件开发领域,AI智能体能够显著提升代码生成、项目管理和自动化任务的效率。通过Model Context Protocol(MCP)等标准化协议,智能体可以安全、结构化地集成外部工具与服务,实现能力扩展。本文聚焦于Codex这一AI驱动的代码助手平台,详细解析其环境配置、代码索引、记忆系统等核心模块,并深入探讨

weixin_34220179的博客 593

YOLO v3 详解

(一)核心思想(二)Darknet-53(三)网络结构(四)9 种尺度先验框(五)输入与输出(六)检测效果

Kula的博客 8355

行政数据分析大屏实战:用Tableau从Excel到看板的完整搭建流程(含数据连接与字段计算避坑)

本文详细介绍了如何利用Tableau从Excel数据源搭建行政数据分析大屏的完整流程,涵盖数据准备、连接技巧、计算字段优化、看板设计及动态交互部署。通过五阶工作流,帮助用户高效处理多源异构数据,实现业务洞察与可视化呈现,提升行政数据分析效率。

weixin_29696711的博客 340

YOLO_v3详解

YOLO_v3讲解

weixin_43702653的博客 4891

大一Python之循环解决实际问题

pythin之循环解决实际问题

weixin_66263546的博客 2288

基于YOLOv10深度学习的花生种子霉变检测系统

YOLO(You Only Look Once)是当前最先进的目标检测算法之一,具有快速、精准的特性。YOLOv10是YOLO系列的最新版本,相较于之前的版本,YOLOv10在特征提取、模型精度和速度上都有了显著的提升。YOLOv10采用了更深的卷积神经网络、更多的跨层特征融合方法,使得其在不同尺寸物体的检测和复杂场景的处理上都表现出了优异的性能。YOLOv10特别适合应用在需要快速处理并检测大量图像的任务中,如花生种子霉变检测等,能够实现精准、高效的检测。

2201_76125393的博客 648

单阶段(one-stage):YOLO系列,从YOLO-V1到YOLO-V3发展过程及改进

单阶段(one-stage):YOLO系列,从YOLO-V1到YOLO-V3发展过程及改进,双阶段(two-stage):Faster-rcnn Mask-Rcnn系列

weixin_62263529的博客 1164

YOLO26全新改进 | 最全损失函数改进篇 | SIoU 、WIoU、GIoU、DIoU、EIOU、CIoU, InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

🔥本文详细介绍了如何修改YOLO26中的损失函数。首先提供了完整的损失函数核心代码,包括WIoU_Scale类和各种IoU计算方法。然后分三步指导修改:1)替换metrics.py中的bbox_iou方法;2)修改loss.py中的iou计算代码;3)更新tal.py中的相关代码。文中特别强调了修改损失函数应在模型结构调整后使用,并提供了多种IoU损失函数的参数配置建议,包括SIoU、WIoU、GIoU等,可根据实际需求灵活选择搭配使用。

Ai缝合怪、助力小伙伴高效发论文 450
上一篇: CornerNet:不用 Anchor Boxes 也能进行目标检测(Object Detection)
下一篇: 《Few-Shot Learning with Graph Neural Networks》——少样本学习与图神经网络
田神
博客等级 码龄17年 217粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值