1.深度学习实例分割篇——Mask RCNN原理详解篇
2.目标检测(Faster RCNN)原理 | Pytorch官方源码解释 | VGG | ResNet | ResNet50 FPN | ReXNets
3.解读R-CNN
4.Faster RCNN详解结构介绍
5.(三十)通俗易懂理解——R-CNN
6.捋一捋pytorch官方FasterRCNN代码
深度学习实例分割篇——Mask RCNN原理详解篇
Hello,源码大家好,详解我是源码小苏
在前文已经为大家介绍过深度学习中的物体分类、目标检测和语义分割,详解对相关内容感兴趣的源码读者可以访问我的主页获取更多信息。我力求以通俗易懂的详解deepfool源码方式讲解网络结构原理,配合代码加深理解,源码欢迎一同学习,详解共同成长。源码
Mask RCNN是详解在Faster RCNN基础上引入FCN语义分割模块的深度学习模型,理解其原理前需掌握Faster RCNN结构及FCN语义分割的源码基本概念。
Mask RCNN主要由两部分组成:Faster RCNN结构和FCN语义分割模块。详解通过在Faster RCNN基础上添加FCN结构,源码Mask RCNN能够实现更精细的详解目标分割。
接下来,源码让我们深入了解Mask RCNN的细节。首先,从整体流程出发,Mask RCNN通过特征提取、候选框生成、ROI裁剪与对齐、分类与边界框预测、以及Mask预测五个步骤实现目标的分类、定位和分割。
在分类与边界框预测阶段,采用Faster RCNN中的分类头和回归头进行操作;而在Mask预测阶段,通过FCN结构对候选框对应的特征图进行操作,最终预测出目标的分割掩码。
Mask RCNN的创新点在于通过利用分类分支的预测类别直接提取出对应的Mask,从而消除不同类别之间的竞争关系,提高检测精度。
结构设计上,Mask RCNN采用结构2,要求backbone使用FPN网络以保证Mask分支拥有更多细节信息。结构1要求backbone采用resnet结构。通常,结构2效果更佳,建议使用。
损失函数方面,Mask RCNN由Faster RCNN损失和Mask分支损失组成。Mask损失采用交叉熵损失计算。
训练过程中,损失计算基于RPN网络提供的候选框;预测阶段,候选框来源于Fast RCNN网络。
总结,Mask RCNN通过整合Faster RCNN和FCN结构,实现了目标的精准分类、定位及分割。更多细节将在后续文章中深入探讨。
参考链接:Mask R-CNN论文、rpg单机游戏源码Mask R-CNN网络详解
附录:RoIAlign详解
RoIAlign与RoIPool目的相同,但RoIAlign在实现上避免了量化操作,保留小数,从而提升分割效果。具体过程包括特征提取、候选框生成、ROI裁剪与对齐,以及基于候选框的特征图操作。实验表明,使用RoIAlign的模型在分割任务上表现更优。
目标检测(Faster RCNN)原理 | Pytorch官方源码解释 | VGG | ResNet | ResNet FPN | ReXNets
Faster RCNN,作为目标检测领域的革新之作,其原理在Pytorch官方源码中有详细阐述。该模型旨在提高检测精度和速度,其主要由五部分构成:数据处理(Dataset):首先,创建自定义数据集,包含及其相关信息,如经过放缩的boxes坐标、标签、面积、ID和难度等级。然后,使用DataLoader对数据进行批量处理,确保每批大小一致,并准备相应的特征输入。
主干网络(Backbone):采用经典的网络结构,如VGG、ResNet、ResNet FPN或ReXNets,用于提取的特征,这部分是关键,决定特征提取的深度和效率。
RPN(Region Proposal Network):首先生成多个Anchor在原图上的位置,如根据预设模板生成9个Anchor。ResNet FPN可能使用多个特征图来生成Anchor。RPNHead负责分类(cls_logits)和回归(box_pred)任务,预测每个Anchor包含物体的概率和位置参数。
RPN Loss:计算Anchor与真实物体的IOU,确定正负样本,然后计算回归损失,确保模型学习到正确的框位调整参数。
ROI Pooling & ROI Head:Roipooling对经过RPN处理的proposals进行特征池化,再通过多层感知器(MLP)进行特征提取和分类预测。最终输出包括类别标签、回归参数和特征图。
后处理(Postprocess):对预测结果进行调整、过滤和非极大值抑制,以得到最终的、在原始图像尺寸上的智能识花源码目标框及其相关属性。
理解整个流程后,如果对模型图或代码细节有疑问,可以参考上述章节或直接留言提问。随着社区支持和收藏量的增加,作者计划进一步解析Pytorch官方代码。解读R-CNN
创新点在于使用CNN提取特征,通过在ImageNet上进行预训练和在目标检测数据集上进行微调,显著提升了目标检测性能。
R-CNN通过以下步骤实现目标检测:生成约个候选区域,对每个区域使用CNN提取特征,然后通过SVM分类器进行类别判断,最后使用回归器修正候选框位置。
预训练阶段采用AlexNet网络结构,在ImageNet大样本数据集上做分类训练。
接着,对分类数从减少至,将最后一层换成*的全连接网络,使用PASCAL VOC 训练集进行fine-tune。
每张图像输出维标号,表示类+背景。使用候选框与已标注框重叠面积判断类别归属,学习率设置为0.,每批次包含个正样本和个背景样本。
对每个类别分别训练SVM分类器,使用hard negative mining方法处理大量负样本,正样本为该类的真值标注框,负样本为与所有标注框重叠小于0.3的候选框。
通过线性回归模型进行位置修正,提升检测框准确性。
Faster RCNN详解结构介绍
本文深入解析Faster R-CNN网络结构,旨在实现快速实时目标检测。其核心在于Region Proposal Networks(RPN)与区域池化(RoIPooling)机制。论文由Ren, He, Girshick, Sun共同发布,代码基于Caffe平台。
网络的输入图像大小不受限制,本文假设为*。通过多层卷积提取特征,最终输出特征图大小为特定维度。此阶段,理解锚点(anchor)至关重要。锚点是人为设定的不同大小的bounding box,可能与目标大小相近。文章设计9种锚点,长宽比包括1:1, 1:2, 2:1。每个锚点在输入图像中对应映射,产生特定数量的候选区域。
Region Proposal Network(RPN)整合了conv5层特征,经过一系列操作,输出每个候选区域的网页html源码提取二分类分数和位置偏移量。通过softmax和重塑,RPN生成了属于前景的候选区域列表。RoIPooling层依据候选区域大小,从conv5层提取对应尺寸的特征,均分后进行池化,最终得到统一大小的特征图。
通过解析Faster R-CNN网络结构,本文强调了锚点、RPN与RoIPooling在实现快速实时目标检测中的关键作用。锚点为模型提供候选区域,RPN进行分类与位置调整,而RoIPooling确保后续处理的统一性。整体设计旨在高效识别各种大小的目标,实现高效、实时的目标检测。
(三十)通俗易懂理解——R-CNN
R-CNN算法是年提出的一种经典Object Detection算法,主要用于识别图像中的物体位置和类别。该算法在PASCAL VOC 数据集上的mAP成绩为.3%,在当时已表现出较好的性能。下面将对R-CNN算法的解决的问题、算法简述、算法详解以及训练和测试过程进行详细阐述。 一、解决的问题 R-CNN算法主要解决Object Detection中的两个关键问题:定位(localization)和识别(recognition),即准确确定物体在图像中的位置,并识别出物体的类别。其核心是通过深度学习的方法,结合候选区域生成、特征提取、分类器训练和回归等步骤,实现对物体的精确检测。 二、算法简述 为了实现Object Detection,R-CNN算法使用了以下关键步骤:1. **候选区域生成**:采用Selective Search方法从图像中生成约个候选区域,这些区域是物体可能存在的位置。
2. **特征提取**:使用预训练的深度网络(如AlexNet)提取候选区域的特征。
3. **分类器训练**:针对每个类别训练SVM分类器,利用深度网络的特征进行分类。
4. **回归**:针对每个类别训练回归器,对候选区域进行修正以提高定位精度。
5. **结果筛选**:应用非极大值抑制(NMS)去除重复或重叠的检测结果。
三、算法详解 **训练过程**:1. **准备候选区域**:使用Selective Search算法生成候选区域,每个图像约个。
2. **特征预处理**:将候选区域归一化至x尺寸,进行CNN特征提取。
3. **分类器训练**:针对每个类别训练SVM分类器,使用深度网络的特征。
4. **回归器训练**:针对每个类别训练回归器,jquery源码解析aaaron对候选区域进行定位修正。
5. **结果整合**:应用NMS剔除重复检测结果。
**测试过程**:1. **候选区域提取**:在测试图像上提取约个候选区域。
2. **特征提取**:将候选区域变形至x尺寸,进行CNN特征提取。
3. **分类与回归**:针对每个类别进行分类与回归,得到修正后的bounding boxes。
4. **结果筛选**:应用NMS剔除重复检测结果。
四、算法优点与缺点 R-CNN算法在当时已表现出较好的性能,但在训练时间、计算资源和内存占用方面存在一定的限制。随着Fast R-CNN等后续算法的改进,这些问题得到了有效解决,使得深度学习在Object Detection领域的应用更加广泛和高效。捋一捋pytorch官方FasterRCNN代码
pytorch torchvision 模块集成了 FasterRCNN 和 MaskRCNN 代码,本文旨在帮助初学者理解 Two-Stage 检测的核心问题。首先,请确保您对 FasterRCNN 的原理有初步了解,否则推荐阅读上一篇文章。
△ 代码结构
作为 torchvision 中目标检测的基础类,GeneralizedRCNN 继承了 torch.nn.Module。FasterRCNN 和 MaskRCNN 都继承了 GeneralizedRCNN。
△ GeneralizedRCNN
GeneralizedRCNN 类继承自 nn.Module,具有四个关键接口:transform、backbone、rpn、roi_heads。
△ transform
transform 接口主要负责图像缩放,并记录原始图像尺寸。缩放图像是为了提高工程效率,防止内存溢出。理论上,FasterRCNN 可以处理任意大小的,但实际应用中,图像大小受限于内存。
△ backbone + rpn + roi_heads
完成图像缩放后,正式进入网络流程。这包括 backbone、rpn、roi_heads 等步骤。
△ FasterRCNN
FasterRCNN 继承自 GeneralizedRCNN,并实现其接口。transform、backbone、rpn、roi_heads 分别对应不同的功能。
△ rpn 接口实现
rpn 接口实现中,首先使用 AnchorGenerator 生成 anchor,然后通过 RPNHead 计算每个 anchor 的目标概率和偏移量。AnchorGenerator 生成的 anchor 分布在特征图上,其数量与输入图像的大小相关。
△ 计算 anchor
AnchorGenerator 通过计算每个特征图相对于输入图像的下采样倍数 stride,生成网格,并在网格上放置 anchor。每个位置的 anchor 数量为 个,包括 5 种 anchor size 和 3 种 aspect_ratios。
△ 区分 feature_map
FasterRCNN 使用 FPN 结构,因此需要区分多个 feature_map。在每个 feature_map 上设置 anchor 后,使用 RegionProposalNetwork 提取有目标的 proposals。
△ 提取 proposals
RegionProposalNetwork 通过计算有目标的 anchor 并进行框回归,生成 proposals。然后依照 objectness 置信度排序,并进行 NMS,生成最终的 boxes。
△ 训练损失函数
FasterRCNN 在训练阶段关注两个损失函数:loss_objectness 和 loss_rpn_box_reg。这两个损失函数分别针对 rpn 的目标概率和 bbox 回归进行优化。
△ roi_pooling 操作
在确定 proposals 所属的 feature_map 后,使用 MultiScaleRoIAlign 进行 roi_pooling 操作,提取特征并转为类别信息和进一步的框回归信息。
△ 两阶段分类与回归
TwoMLPHead 将特征转为 维,然后 FastRCNNPredictor 将每个 box 对应的特征转为类别概率和回归偏移量,实现最终的分类与回归。
△ 总结
带有 FPN 的 FasterRCNN 网络结构包含两大部分:特征提取与检测。FasterRCNN 在两处地方设置损失函数,分别针对 rpn 和 roi_heads。
△ 关于训练
在训练阶段,FasterRCNN 通过 RPN 和 RoIHeads 分别优化 anchor 和 proposals 的目标概率和 bbox 回归,实现目标检测任务。
△ 写在最后
本文简要介绍了 torchvision 中的 FasterRCNN 实现,并分析了关键知识点。鼓励入门新手多读代码,深入理解模型机制。尽管本文提供了代码理解的指引,真正的模型理解还需阅读和分析代码。
一文详解R-CNN、Fast R-CNN、Faster R-CNN
在计算机视觉领域,目标检测是一项关键任务,它要求对图像中的多个目标进行分类和定位。传统方法依赖人工设计特征,而深度学习的兴起,特别是AlexNet在ILSVRC挑战赛中的胜利,推动了以深度学习为基础的目标检测算法发展。R-CNN系列算法是这一转变的里程碑,包括R-CNN、Fast R-CNN和Faster R-CNN。
Faster R-CNN是R-CNN和Fast R-CNN的进化,它主要解决了前者的训练和测试时间长,占用存储空间大,以及多阶段操作的问题。它的核心改进在于引入了RPN(Region Proposal Network),直接从图像中生成候选区域,显著提升了速度。Faster R-CNN采用了VGG或MobileNet等深度网络作为特征提取器,通过RPN找到候选区域,并通过ROI Pooling进行特征统一,最后通过SoftMax分类器进行目标分类和位置微调。
举例来说,Faster R-CNN在多目标检测任务中,如Pascal VOC数据集,表现出极高的准确性,即使在光照条件不佳的情况下也能检测出大量目标。在医学领域,如血细胞检测,它也展现了良好的识别效果,有助于医疗诊断。在驾驶员驾驶检测中,通过制作数据集并使用Faster R-CNN进行驾驶员行为分析,有助于提高行车安全。
尽管Faster R-CNN取得了显著进步,但它在实时性方面仍有提升空间,One-Stage算法如SSD和YOLO系列在速度上更胜一筹。未来,目标检测可能会融合实例分割和人机交互,进一步提升对目标的理解和识别。随着技术的不断发展,目标检测将更加智能化,为自动驾驶、智能机器人等应用提供关键支持。
Faster R-CNN详解和网络模型搭建
论文原文: arxiv.org/abs/....
个人代码仓库: GitHub - dailonggang/Faster-R-CNN
文章部分引自: zhuanlan.zhihu.com/p/...
我们知道Faster RCNN是由R-CNN、Fast R-CNN改进而来,是非常经典的两阶段网络,下面我们就原理和代码进行介绍。在此之前大家可以先了解一下R-CNN、Fast R-CNN的原理,这样对Faster RCNN也能有更好的理解,毛遂自荐一下:
Faster R-CNN其实可以分为5个主要内容:
Faster R-CNN整体结构图如下所示:
下面就Faster R-CNN上面的5个部分做一个比较详细的介绍:
二、Resize
首先对输入的图像进行resize操作,以适应模型要求,单独resize.py文件进行实验。
三、Backbone
接下来利用ResNet网络进行特征提取得到特征图(Feature Map)。有关ResNet的原理和代码部分可以参考: ResNet网络结构详解与Pytorch版本模型的搭建。还可以单独进行调试。
四、RPN网络
RPN网络实际分为2条线,上面一条通过 softmax 对前景(positive)和背景(negative)进行分类,下面一条用于对anchors进行bounding box regression偏移量,以获得精确的proposal。
Region Proposal Networks(RPN)和锚框(anchor)
RPN作为Faster RCNN的一大主要创新点,网络直接使用RPN生成候选区域,这也将生成区域提议的时间从2s缩减到了ms,大大提升了生成待检测区域的速度。从网络图也可以看出Faster R-CNN其实就是RPN和Fast-RCNN的结合。提到RPN网络,就不能不说锚框(anchor)。锚框是在原图上设置不同大小的假想框,来检测框中是否出现物体。简单地说,RPN依靠一个在共享特征图上滑动的窗口,为每个位置生成9种预先设置好长宽比与面积的框(anchor)。这9种初始anchor包含三种面积(×,×,×),每种面积又包含三种长宽比(1:1,1:2,2:1)。如下图所示:
anchor生成代码:
在原文中,经过特征提取后,共享特征图的大小约为×,RPN生成的初始anchor总数为(××9)。对于生成的anchor,RPN要做的事情有两个,第一个是判断anchor到底是前景还是背景,意思就是判断这个anchor到底有没有覆盖目标,在训练的时候排除掉了超越图像边界的anchor,剩下大约个,通过上面的分支,也就是先经过一个3×3卷积,得到一个相同大小shape的特征图,然后经过一个1×1的卷积层输出了个值,因为是每一个点对应9个anchor,每个anchor有一个前景分数和一个背景分数,所以9×2=;第二个是为属于前景的anchor进行第一次坐标修正。经过另一个1×1的卷积层输出了个值,因为是每一个点对应9个anchor,每个anchor对应了4个修正坐标的值,所以9×4=。那么,要得到这些值,RPN网络需要训练。在训练的时候,就需要对应的标签。那么,如何判定一个anchor是前景还是背景呢?文中做出了如下定义:如果一个anchor与ground truth的IoU在0.7以上,那这个anchor就算前景(positive)。类似地,如果这个anchor与ground truth的IoU在0.3以下,那么这个anchor就算背景(negative)。这样最终得到约个候选框。但是作者在进行RPN网络训练的时候,只使用了上述两种情况的anchor,与ground truth的IoU介于0.3和0.7的anchor没有使用。在训练anchor属于前景与背景的时候,是在一张图中,随机抽取了个前景anchor与个背景anchor。其实还有另一种方案就是取IoU最大值。正样本是在不够,就用负样本进行补充。下面的propsal还会细说。代码如下:
这里补充一点,其实原论文中是对k个anchor进行的操作,使用二分类交叉熵损失函数,如果按照我们使用2k个,那么就应该使用多分类交叉熵损失函数。另外,如果我们使用VGG作为主干特征提取网络的话,那么对于提取得到的特征图的感受野应该是,显然小于和这两个面积,但是论文中也提到了,其实小于只看部分也能推测出结果,通过后续算法验证也确实如此。
对于感受野的计算大家可以参见下面文章:
五、Proposal Layer
由网络结构图可以看出,Proposal Layer负责综合所有计算出精准的proposal,送入后续RoI Pooling Layer。
首先解释im_info。对于一副任意大小PxQ图像,传入Faster RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息。然后经过Conv Layers,经过4次pooling变为WxH=(M/)x(N/)大小,其中feature_stride=则保存了该信息,用于计算anchor偏移量。
Proposal Layer forward按照以下顺序依次处理:
之后输出proposal=[x1, y1, x2, y2],注意,由于在第2步中将anchors映射回原图判断是否超出边界,所以这里输出的proposal是对应MxN输入图像尺度的,这点在后续网络中有用。另外我认为,严格意义上的检测应该到此就结束了,后续部分应该属于识别了。
通俗点来讲就是Proposal Layer会对RPN输出的分类和回归结果进行后处理(如NMS等),得到网络认为包含物体的区域,称为感兴趣的候选区域——RoI。至此,其实已经完成了定位任务,因为已经得到了包含物体的区域(bbox),只不过没有对物体类别进行细分,仅区分了前、背景。另外,由于anchor的位置和大小是人工预设的,且用于训练的样本有限,因此此处得到的检测结果可能并不够精准。
代码如下:
到这里RPN就解析完毕了。
六、RoI Pooling和Classifier
RoI Pooling就不再赘述。Classifier部分利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等);同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。Classification部分网络结构如下图。
从RoI Pooling获取proposal feature maps后,送入后续网络,可以看到做了如下2件事:
注意,这里回归的结果是预测框中心点相对于正样本RoIs中心点坐标的位移以及两者长宽的比例,并且是归一化(减去均值除以标准差)后的结果。
代码如下:
在训练分类器和RoI边框修正时,步骤如下所示:
1) 首先通过RPN生成约个anchor(××9)。
2) 对个anchor进行第一次边框修正,得到修订边框后的proposal。
3) 对超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围。
4) 忽略掉长或者宽太小的proposal。
5) 将所有proposal按照前景分数从高到低排序,选取前个proposal。
6) 使用阈值为0.7的NMS算法排除掉重叠的proposal。
7) 针对上一步剩下的proposal,选取前个proposal进行分类和第二次边框修正。
总的来说,Faster R-CNN的loss分两大块,第一大块是训练RPN的loss(包含一个SoftmaxLoss和SmoothL1Loss),第二大块是训练Fast R-CNN中分类器的loss(包含一个SoftmaxLoss和SmoothL1Loss),其实原论文中训练方法特别复杂,但是现在大多直接采用RPN Loss + Fast R-CNN Loss的联合训练方法。
宝藏UP主: Bubbliiiing的个人空间_哔哩哔哩_Bilibili