概述
计算机视觉中关于图像识别有四大类任务:
- 分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。
- 定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。
- 检测-Detection:解决“在哪里?是什么?”的问题,即定位出这个目标的位置并且知道目标物是什么。
- 分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。
目标检测(Object Detection)的任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。所以目标检测是一个分类、回归问题的叠加。
目标检测需要解决的问题包括:
- 分类问题:图片中的图像属于哪个类别
- 定位问题:目标出现在图像的哪个位置
- 大小问题:目标的尺寸如何
- 形状问题:目标可能有各种不同的形状
分类
目前主流的目标检测算法主要是基于深度学习模型,大概可以分成两大类别:
- One-Stage目标检测算法,这类检测算法不需要先产生候选区域(Region Proposals),可以通过一个Stage直接产生物体的类别概率和位置坐标值,比较典型的算法有YOLO、SSD和CornerNet等;
- Two-Stage目标检测算法,这类检测算法将检测问题划分为两个阶段,第一个阶段首先产生候选区域,包含目标大概的位置信息,然后第二个阶段对候选区域进行分类和位置精修,这类算法的典型代表有R-CNN,Fast R-CNN,Faster R-CNN等。
目标检测模型的主要性能指标是检测准确度和速度,其中准确度主要考虑物体的定位以及分类准确度。一般情况下,Two-Stage算法在准确度上有优势,而One-Stage算法在速度上有优势。不过,随着研究的发展,两类算法都在两个方面做改进,均能在准确度以及速度上取得较好的结果。
原理
候选区域产生
一些目标检测技术都会涉及候选框(bounding boxes)的生成,例如RCNN。候选区域的生成有两种方法:
- 滑动窗口:对输入图像进行不同窗口大小的滑窗进行从左往右、从上往下的滑动,每次滑动的时候对当前窗口执行分类器(预先训练好),如果当前窗口得到了较高的分类概率则认为检测到了物体。对每个不同窗口大小的滑动窗口都进行检测之后,会得到不同窗口检测到的物体标记,其中一定会存在重复较高的部分,需要使用非极大值抑制的方法进行筛选。这种方法简单易于理解,但是全局搜索会导致效率低下。
- 选择性搜索:图像中物体可能存在的区域应该是有某些相似性或者连续性区域的。选择性搜索便利用了这些相似性进行候选框的生成。首先,对输入图像进行分割算法产生许多小的子区域。其次,根据这些子区域之间相似性(相似性标准主要有颜色、纹理、大小等等)进行区域合并,不断的进行区域迭代合并。每次迭代过程中对这些合并的子区域做bounding boxes(外切矩形),这些子区域外切矩形就是通常所说的候选框。
输出结果
目标检测的输出结果通常包含两个部分:一部分是检测到目标的边框坐标与置信度,另一部分是目标属于某个类别的概率。
因此,最终的损失函数也由分类损失和回归损失两部分组成。
效果评估
使用IoU(Intersection over Union,交并比)来判断模型的好坏。所谓交并比,是指预测边框、实际边框交集和并集的比率,一般约定0.5为一个可以接收的值。
非极大值抑制
预测结果中,可能多个预测结果间存在重叠部分,需要保留交并比最大的、去掉非最大的预测结果,这就是非极大值抑制(Non-Maximum Suppression,NMS)。如下图所示,对同一个物体预测结果包含三个概率0.8/0.9/0.95,经过非极大值抑制后,仅保留概率最大的预测结果。
模型
Two-stage
R-CNN系列
R-CNN
基本思想
R-CNN借鉴了滑动窗口的思想,采用对区域进行识别的方案。给定一张输入图片,先从图片中提取出约2000个类别独立的候选区域,对于这些区域先使用CNN抽取出一个固定长度的特征向量,然后再对每个区域使用SVM进行目标分类。大致流程如下图所示:
候选区域生成
能够生成候选区域的方法有很多,包括滑动窗口、选择性搜索等。R-CNN使用的是选择性搜索算法生成候选区域,这一算法会首先将图像分割成小区域,然后重复对可能性最高的两个区域进行合并(颜色相近、纹理相近、合并后面积小等规则),直到整个图像合并为一个区域位置,最终输出所有曾经存在过的区域。
为了避免遗漏候选区域,选择性搜索算法会在多个颜色空间内进行,对于所有颜色空间与所有合并规则得到的全部结果,在去除掉重复后全部作为候选区域输出。
网络结构
R-CNN使用AlexNet抽取一个4096维的特征向量,网络的输入为227*227。对于不同尺寸的图像,统一将其变换为这个尺寸。
模型预测
由于候选区域较多,因此很多会发生重叠。因此需要采取非极大性抑制的方法筛选出最终的检测框。针对于每个类,计算IoU指标,以最高分的区域为基础,剔除掉重叠位置的区域,从而得到最终结果。
Fast R-CNN
R-CNN存在以下几个问题:
- 训练分多步,R-CNN的训练先要微调一个预训练的网络,然后针对每个类别都训练一个SVM分类器,最后还要用回归器对候选框进行回归,另外候选区域也要单独用选择性搜索的方式获得,步骤比较繁琐。
- 时间和内存消耗比较大,在训练SVM和回归的时候需要用网络训练的特征作为输入,特征保存在磁盘上再读入的时间消耗较大。
- 测试的时候比较慢,每张图片的每个候选区域都要做卷积,重复操作过多。
在Fast R-CNN之前提出的SPPNet算法解决了R-CNN中重复卷积的问题,同时允许各种尺寸的图像作为输入,但是其它缺点仍然存在。因此Fast R-CNN相当于全面改进了原有的这两个算法,使得训练步骤减少,同时训练速度和测试速度都有很大程度的提升。
Fast R-CNN的改进点包括:
网络结构的改变:Fast R-CNN的网络结构如下图所示:
Fast R-CNN的输入包括两部分,一部分是待处理的整张图像,另一部分是候选区域。候选区域的提取仍然使用Selective Search算法,并需要把这些候选区域按照空间位置关系映射到最后的卷积特征层。
Fast R-CNN处理的第一步是对图像进行多次卷积和池化处理来获取卷积特征图。由于存在多个候选区域,系统会有一个甄别,判断出感兴趣区域(Region of Interest, RoI)。
RoI池化层是SSP(Spatial Pyramid Pooling)层的特殊情况,它可以从特征图中提取一个固定长度的特征向量。SPP Layer对每个候选区域使用了不同大小的金字塔映射,即SPP Layer采用多个尺度的池化层进行池化操作;而RoI Pooling Layer只需将不同尺度的特征图下采样到一个固定的尺度,即RoI Pooling Layer只采用单一尺度进行池化。它们的区别如下图所示:
每个特征向量都会被输送到全连接层序列中,全连接层会分支为两个同级输出层。其中一层的功能是进行分类,对目标关于K个对象类(包括全部”背景background”类)输出每一个RoI的概率分布,也就是产生softmax概率估计;另一层是为了输出K个对象中每一个类的四个实数值(bbox regression),每4个值编码K个类中的每个类的精确边界框(bounding-box)位置。整个结构是使用多任务损失的端到端训练。
Fast R-CNN统一了类别输出任务和候选框回归任务,有两个损失函数:分类损失和回归损失。分类采用softmax代替SVM进行分类,共输出N(类别)+1(背景)类。softmax由于引入了类间竞争,所以分类效果优于SVM。回归损失输出的是4*N(类别),4表示的是候选框的中心坐标和宽、高共四个属性。
为了提高运算速度,用奇异值分解对全连接层进行变换来提高运算速度。一个大的矩阵可以近似分解为三个小矩阵的乘积,分解后的矩阵的元素数目远小于原始矩阵的元素数目,从而达到减少计算量的目的。
Faster R-CNN
Faster R-CNN做出的改进包括:
网络结构的改变。Faster RCNN将特征抽取,备选区域提取,目标边框的回归与物体分类都整合在了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显。整体的网络结构如下图所示:
对于一幅任意大小P*Q的图像,首先将其缩放至固定大小M*N,然后将其输入到一个CNN网络中得到Feature Map。在此之后网络分为两个分支:一个分支被直接输送到RoI池化层,另一个分支则需要经过一个Region Proposal Network(RPN)网络生成备选区域之后再被输送到RoI池化层。最终,经过全连接层之后对识别出的物体进行分类以及检测框的位置修正。
相比于R-CNN方法,抛弃了使用选择性搜索生成候选区域的方法,而是直接使用RPN网络生成检测框,这使得Faster R-CNN的检测框生成速度得到极大的提升。
使用RPN网络生成备选区域。首先,为Feature Map的每一个点都设定了9个大小不同的锚框作为初始的检测框。如下图所示:
由于这些锚框的数量很多,因此需要经过一个Softmax操作提取出包含物体的锚框作为候选区域。这一操作对应于网络结构中的如下部分,其中输出大小18对应于9个锚框以及每个锚框的正/负分类(即锚框是否包含目标)。
同时,另一条分支对锚框的位置进行调整,图中的36对应于9个锚框以及每个锚框的4个尺寸变换属性。
最终,两条分支被汇总到Proposal Layer,计算出精准的备选框位置与尺寸,然后送入到RoI池化层。Proposal Layer会进行如下的处理:筛选出正样本得分排名靠前的锚框,并计算出它们的修正后位置;之后,将锚框的尺寸约束到图像内部;最终剔除尺寸很小的锚框并且对剩下的锚框做NMS从而得到最终的备选框。
网络的训练过程如下图所示:
One-stage
YOLO系列
YOLO意思是You Only Look Once,相比于Two-stage的R-CNN系列模型,将候选区和对象识别这两个阶段合二为一。实际上,YOLO并没有真正去掉候选区,而是采用了预定义的候选区(准确点说应该是预测区,因为并不是Faster RCNN所采用的Anchor)。也就是将图片划分为 多个网格(grid),每个网格允许预测出若干个边框(bounding box,包含某个对象的矩形框)。可以理解为候选区通过这种方式产生,它们很粗略的覆盖了图片的整个区域。
YOLO的目标检测速度较快,但是准确率比起R-CNN系列要稍差。
YOLOv1
设计思路
整体来看,YOLO1采用一个单独的CNN网络实现end-to-end的目标检测。首先将输入图片resize到448x448,然后送入CNN网络,最后处理网络预测结果得到检测的目标。相比于R-CNN算法,其是一个统一的框架,因此速度更快,且网络训练更方便。下图为YOLO1检测系统的示意图:
具体来说,YOLO的CNN网络将输入的图片分割为\(S\times S\)大小的网格,然后每个网格负责去检测那些中心点落在该格子内的目标。如下图所示,可以看到狗这个目标的中心落在左下角的一个单元格内,那么这个单元格负责预测这只狗。也就是说,这个目标中心(即图中的红点)所在单元格对应的输出中,狗的概率为1,其它物体的概率都为0;而在其它网格对应的输出中,狗的概率也都为0。图中的汽车和自行车也按照同样的方法进行标记。
每个单元格会预测\(B\)个边界框及它们的置信度。边界框的大小和位置使用一个四元向量\((x,y,w,h)\)来表示,其中\(x\)和\(y\)对应边界框的中心坐标,\(w\)和\(h\)对应于边界框的宽与高。需要说明的是,置信度既包含边界框含有目标的可能性大小信息,记作\(\text{Pr(object)}\);也包含这个边界框的准确度信息,边界框的准确度可以用预测框与实际框的IoU来表征,记作\(\text{IoU}_{\text{pred}}^{\text{truth}}\)。因此置信度可以定义为:\(c=\text{Pr(object)}* \text{IoU}_{\text{pred}}^{\text{truth}}\)。因此,每个边界框的预测值其实是一个包含边界框信息及其置信度的五元向量\((x,y,w,h,c)\)。
对于每一个单元格,还要给出它预测出的\(C\)个类别的概率值,这些值表示由该单元格负责预测的边界框属于各个类别的概率。这些概率值其实是在各个边界框置信度下的条件概率\(\text{Pr}(\text{class}_i|\text{Object})\)。但是YOLO1算法的一个缺点是,无论一个单元格预测多少个边界框,它只能输出一组概率值。
我们也可以计算出各个边界框的类别置信度:\(\text{Pr}(\text{class}_i|\text{Object})*\text{Pr(object)}* \text{IoU}_{\text{pred}}^{\text{truth}}\),它表示的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的效果好坏。一般会根据类别置信度来过滤网络的预测框从而得到最终结果。因此,模型的计算过程可以使用下图来说明:
总结起来的话,每个单元格需要预测\((5B+C)\)个值,如果将输入图片划分为\(S\times S\)的网格,那么最终预测值为\(S\times S\times (5B+C)\)大小的张量。
网络结构
YOLO1使用CNN来提取特征,然后使用全连接层得到预测值,网络结构可参考GoogLeNet模型。在使用PASCAL VOC数据训练网络时,网络的最终输出是一个\(7\times 7\times 30\)大小的张量。因此整个网络结构如下图所示:
对于这个\(7\times 7\times 30\)大小的张量,它的\(7\times 7\)部分代表对图像划分的网格数目,而在每一个网格所对应的长为30的维度上,前20个元素代表每个类别的概率值,紧接着的2个元素代表边界框的置信度,最后8个元素代表边界框的\((x,y,w,h)\)信息。可以用下图来直观地展示:
损失函数
首先写出是YOLO损失函数的表达式: \[ \begin{aligned} loss=~~&~\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}_{ij}^{obj}[(x_i-\hat{x}_i)^2+(y_i-\hat{y}_i)^2] \\ +&~\lambda_{coord}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}_{ij}^{obj}[(\sqrt{w_i}-\sqrt{\hat{w}_i})^2+(\sqrt{h_i}-\sqrt{\hat{h}_i})^2] \\ +&~\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}_{ij}^{obj}(C_i-\hat{C}_i)^2 \\ +&~\lambda_{noobj}\sum_{i=0}^{S^2}\sum_{j=0}^{B}\mathbb{I}_{ij}^{noobj}(C_i-\hat{C}_i)^2 \\ +&~\sum_{i=0}^{S^2}\mathbb{I}_{i}^{obj}\sum_{c\in classes}(p_i(c)-\hat{p}_i(c))^2 \end{aligned} \] 其中,\(\lambda_{coord}\)和\(\lambda_{noobj}\)为两个超参数;\(\mathbb{I}_{ij}^{obj}\)指的是第\(i\)个单元格存在目标,且该单元格的第\(j\)个边界框负责预测该目标时,该值为1,否则为0,其余与之类似的符号可以按此推理。
在上述的损失函数中,每一项的含义如下:
- 第一项代表边界框中心坐标的误差项;
- 第二项代表边界框的宽与高的误差项;
- 第三项是包含目标的边界框的置信度误差项;
- 第四项是不包含目标的边界框的置信误差项;
- 最后一项是包含目标的单元格的分类误差项。
需要注意的是,由于每个单元格预测多个边界框,但是其对应类别只有一个。那么在训练时,如果该单元格内确实存在目标,那么只选择与ground truth的IoU最大的那个边界框认为其中存在目标,而其它边界框认为不存在目标。
模型预测
在网络进行预测的时候,可能会出现对同一个目标多次检测的情况,此时便需要使用非极大值抑制算法(NMS)对检测结果进行过滤。首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除;然后对剩余的检测框重复上述过程,直到处理完所有的检测框。
YOLOv2
YOLOv2相比于YOLOv1做了下面的改进:
使用了Batch Normalization。
在训练过程中,先使用低分辨率图像(224*224)对模型进行分类模型预训练,再使用高分辨率样本(448*448)对分类模型进行微调,在这之后才使用448*448的检测样本进行训练。通过这种方式缓解了分辨率突然切换造成的影响。
网络架构:将网络的基本架构改为DarkNet-19,其中只有卷积层和池化层。因此可以处理不同分辨率的输入。
借鉴了Faster R-CNN的思想,使用锚框去预测检测框,来代替使用全连接层预测检测框,通过这种方式以获得更多的空间信息。
同时,为了让后面产生的卷积特征图的宽和高都为奇数,输入的规模变为416*416,这样使得网络最后的输出变为13*13。假设每个网格产生9个锚框,那么总共会预测出13*13*9个边框,而类别的预测也与锚框绑定在一起。
但是需要注意的是,在YOLOv2的原始论文中,作者最终得出的模型并没有使用这一技术,只是在其中做了一些尝试性的工作。
对锚框进行聚类,来寻找先验框的尺寸。Faster-RCNN中锚框的个数和宽高维度往往是手动选择的先验框,因此如果一开始就选择了更好的、更有代表性的先验框尺寸,那么网络就应该更容易学到准确的预测位置。解决办法就是统计学习中的K-means聚类方法,通过对数据集中的真实边界框做聚类,找到这些边框的统计规律。最终,以聚类个数k作为先验框的个数,以k个聚类中心的尺寸作为先验框的尺寸。
由于我们的目的是产生具有好的IoU得分的边界框,因此距离的度量不是使用欧式距离,而是使用如下的公式:\(d(\text{box,centroid})=1-\text{IoU}(\text{box,centroid})\)。
直接预测相对位置:模型在输出边框的位置特征时,实际上是先验框与真值框之间的偏移量\((t_x,t_y,t_w,t_h,t_o)\),而实际的边界框位置\((b_x,b_y,b_w,b_h)\)通过如下的表达式进行转换: \[ \begin{aligned} b_x=&\sigma(t_x)+c_x\\ b_y=&\sigma(t_y)+c_y\\ b_w=&p_we^{t_w}\\ b_h=&p_he^{t_h} \end{aligned} \] 其中,\(\sigma(x)=\frac{e^x}{1+e^{x}}\),\(c_x\)和\(c_y\)是边界框的中心所在格点的位置(以左上角为基点),\(p_w\)和\(p_h\)为先验框的宽和高。\((b_x,b_y,b_w,b_h)\)的取值范围是\([0,\text{conv-width}]\),其中conv-width指的是模型最终输出特征图的宽度(假设输出宽高相等)。
细粒度特征:为了检测一些小目标,YOLOv2加入了一个passthrough layer,将浅层特征图(分辨率26*26)连接到深层特征图。passthrough layer把高低分辨率的特征图做连结,叠加到不同的通道。这个方法将26*26*512的特征叠加为13*13*2048大小的特征图,然后与网络中的深层特征图连接
多尺度训练:为了让网络对不同尺寸的图片具有鲁棒性,在训练时每经过10轮,就会随机选择一个新的图片尺寸。这种机制使得网络可以更好地预测不同尺寸的图片,同一个网络可以完成不同分辨率的检测任务。
为了检测更多对象,YOLOv2通过对名词对象进行层级分类(即从大类到小类),建立了WordTree,从而大大扩展了检测对象的类型。
YOLOv3
YOLOv3相比于v2做了如下的改进:
网络结构的改变:YOLOv3使用了Darknet-53的网络结构。在这个网络结构中,是没有池化层和全连接层的。在YOLOv3前向传播的过程中,张量的尺寸是通过改变卷积核的步长来实现的,而在YOLOv2中是通过最大池化来进行的,二者的尺寸变换操作都是5次。
YOLOv3的网络结构如下图所示:
输出张量的改变:YOLOv3输出了3个不同尺度的feature map。这一点借鉴了FPN(feature pyramid networks),采用多尺度来对不同尺寸的目标进行检测,越精细的网格(如52*52)就可以检测出越精细的物体。
YOLOv3设定的是每个网格单元预测3个边框,而每个边框对应于80个类别(COCO数据集)以及5个边框尺寸的参数,这便是输出中255的来历。
同样使用聚类得到先验框的大小,但是这些先验框会根据它们的大小不同,被分别用在3个不同尺度的feature map,如下图所示:
图中的蓝色框代表聚类得到的先验框尺寸,黄色框为ground truth,红色框为检测目标中心点所在的网格。
损失函数的改变:不再对分类的结果做softmax处理,对图像中检测到的目标做多标签分类。损失函数包括四部分:xy的损失、wh的损失、置信度的损失和分类的损失。除了wh的损失使用平方误差之外,其余损失使用二值交叉熵。
YOLOv4
YOLOv4算法是在原有YOLO目标检测架构的基础上,使用了近些年CNN领域中各种优秀的优化策略,从数据处理、主干网络、网络训练、激活函数、损失函数等各个方面都有着不同程度的尝试与优化,文章如同于目标检测的trick综述。
YOLOv4在如下几个方面进行了优化:
网络结构方面,相比于YOLOv3,将主干网络修改为CSPDarknet53,使用PANet作为Neck部分。同时在网络中使用了Mish激活函数和DropBlock(去除掉局部区域,而不是像Dropout一样随机去除)等手段。
YOLOv4的网络结构如下图所示:
在输入端使用各种方式进行改进,包括Mosaic数据增强、Mixup数据增强、cmBN、SAT自对抗训练等,其中Mosaic数据增强的手段对于训练效果影响很大。
对于边框的回归问题,使用了CIoU损失,解决了边界框不重合的问题,并将边界框中心点距离以及宽高比的尺度信息也考虑进去。
使用遗传算法对超参数进行选择
备注:
- YOLOv4的论文中将目标检测的网络框架分成如下图所示的结构
- 论文中将训练中使用到的一些技巧分为两种类型:
- Bag of Freebies,指的是可以提高精度但是不增加训练时间的设计,包括:
- 数据增广的方法:图像几何变换、CutOut、MixUp、CutMix、GAN等
- 网络正则化的方法:Dropout、DropBlock等
- 类别不平衡的处理方法
- 难例挖掘方法
- 损失函数的设计
- Bag of Specials,指的是稍许增加推断代价,但是可以提高模型精度的办法,包括:
- 增大模型感受野的办法:SPP、ASPP、RFB等
- 注意力机制:SE、SAM等
- 特征集成方法:SFAM、ASFF、BiFPN等
- 改进的激活函数:Swish、Mish等
- 后处理方法:soft NMS、DIoU NMS等
YOLOv5
相比于YOLOv4,YOLOv5主要是网络结构上的变化:
YOLOv5在模型训练时同样使用到了上文中提到的一些方法,故此处不再赘述。在工程上,GitHub仓库ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite (github.com)中已经给出了PyTorch实现的YOLOv5代码以及预训练模型,可以方便地使用。
SSD
SSD具有如下主要特点:
- 从YOLO中继承了将detection转化为regression的思路,同时一次即可完成网络训练
- 基于Faster RCNN中的anchor,提出了相似的prior box;
- 加入基于特征金字塔(Pyramidal Feature Hierarchy)的检测方式,相当于半个FPN思路
SSD的网络结构如下图所示:
SSD的网络框架以VGG16为基础做了一些修改,抽取不同卷积层的特征图并在上面的每一个点都构造出备选框,最终将这些备选框合起来,并使用非最大值抑制的方法删除部分重叠或者不正确的备选框,从而生成最终的检测结果。由于不同大小的特征图具有不同的感受野,因此在多个卷积层上进行检测时,从理论上来说可以取得更好的检测效果。
在特征图的每个位置预测K个bbox,对于每一个bbox需要预测C个类别得分,以及相对于Default box的4个偏移量值,因此总共需要 (C+4)×K个预测器,在m×n的feature map上面将会产生 (C+4)×K×m×n个预测值。
SSD的损失函数分为两部分:第一部分为位置回归损失,使用的是平滑的L1损失函数;第二部分为置信度损失,使用softmax损失函数。
参考
- 目标检测(Object Detection)_yegeli的博客-CSDN博客_目标检测
- 目标检测(Object Detection)入门概要_hyfine-CSDN博客
- 目标检测最新进展总结与展望 - 知乎 (zhihu.com)
- 你一定从未看过如此通俗易懂的YOLO系列(从v1到v5)模型解读 (上) - 知乎 (zhihu.com)
- 【深度学习YOLO V1】深刻解读YOLO V1(图解)_c20081052的专栏-CSDN博客_yolov1
- 目标检测|YOLO原理与实现 - 知乎 (zhihu.com)
- 目标检测综述 - FANG_YANG - 博客园 (cnblogs.com)
- 超全面目标检测算法综述 - 简书 (jianshu.com)
- <机器爱学习>YOLO v1深入理解 - 知乎 (zhihu.com)
- YOLOv2 论文笔记_Jesse_Mx的博客-CSDN博客_yolov2论文
- YOLO2 - 知乎 (zhihu.com)
- 一文看懂YOLO v3_litt1e的博客-CSDN博客_yolov3
- https://arxiv.org/pdf/1506.02640.pdf
- https://arxiv.org/pdf/1612.08242v1.pdf
- https://pjreddie.com/media/files/papers/YOLOv3.pdf
- https://arxiv.org/pdf/2004.10934.pdf
- 深入浅出Yolo系列之Yolov3&Yolov4&Yolov5核心基础知识完整讲解 - 知乎 (zhihu.com)
- 一文了解YOLO-v4目标检测 - 知乎 (zhihu.com)
- 深入浅出Yolo系列之Yolov5核心基础知识完整讲解 - 知乎 (zhihu.com)
- R-CNN - 简书 (jianshu.com)
- 【深度学习】R-CNN 论文解读及个人理解_frank 的专栏-CSDN博客
- https://arxiv.org/abs/1311.2524
- https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Girshick_Fast_R-CNN_ICCV_2015_paper.pdf
- 【目标检测】Fast RCNN算法详解_shenxiaolu1984的专栏-CSDN博客
- https://arxiv.org/abs/1506.01497
- 一文读懂Faster RCNN - 知乎 (zhihu.com)
- https://arxiv.org/abs/1512.02325
- 目标检测之SSD_thisiszdy的博客-CSDN博客_ssd目标检测
- 目标检测算法之SSD_小白将-CSDN博客_ssd算法