yolov3(yolov3训练自己的数据超详细)

目标检测算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)

深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理。  目标检测可以理解为是物体识别和物体定位的综合 ,不仅仅要识别出物体属于哪个分类,更重要的是得到物体在图片中的具体位置。 2014年R-CNN算法被提出,基本奠定了two-stage方式在目标检测领域的应用。它的算法结构如下图 算法步骤如下: R-CNN较传统的目标检测算法获得了50%的性能提升,在使用VGG-16模型作为物体识别模型情况下,在voc2007数据集上可以取得66%的准确率,已经算还不错的一个成绩了。其最大的问题是速度很慢,内存占用量很大,主要原因有两个 针对R-CNN的部分问题,2015年微软提出了Fast R-CNN算法,它主要优化了两个问题。 R-CNN和fast R-CNN均存在一个问题,那就是 由选择性搜索来生成候选框,这个算法很慢 。而且R-CNN中生成的2000个左右的候选框全部需要经过一次卷积神经网络,也就是需要经过2000次左右的CNN网络,这个是十分耗时的(fast R-CNN已经做了改进,只需要对整图经过一次CNN网络)。这也是导致这两个算法检测速度较慢的最主要原因。 faster R-CNN 针对这个问题, 提出了RPN网络来进行候选框的获取,从而摆脱了选择性搜索算法,也只需要一次卷积层操作,从而大大提高了识别速度 。这个算法十分复杂,我们会详细分析。它的基本结构如下图 主要分为四个步骤: 使用VGG-16卷积模型的网络结构: 卷积层采用的VGG-16模型,先将PxQ的原始图片,缩放裁剪为MxN的图片,然后经过13个conv-relu层,其中会穿插4个max-pooling层。所有的卷积的kernel都是3x3的,padding为1,stride为1。pooling层kernel为2x2, padding为0,stride为2。 MxN的图片,经过卷积层后,变为了(M/16) x (N/16)的feature map了。 faster R-CNN抛弃了R-CNN中的选择性搜索(selective search)方法,使用RPN层来生成候选框,能极大的提升候选框的生成速度。RPN层先经过3x3的卷积运算,然后分为两路。一路用来判断候选框是前景还是背景,它先reshape成一维向量,然后softmax来判断是前景还是背景,然后reshape恢复为二维feature map。另一路用来确定候选框的位置,通过bounding box regression实现,后面再详细讲。两路计算结束后,挑选出前景候选框(因为物体在前景中),并利用计算得到的候选框位置,得到我们感兴趣的特征子图proposal。 卷积层提取原始图像信息,得到了256个feature map,经过RPN层的3x3卷积后,仍然为256个feature map。但是每个点融合了周围3x3的空间信息。对每个feature map上的一个点,生成k个anchor(k默认为9)。anchor分为前景和背景两类(我们先不去管它具体是飞机还是汽车,只用区分它是前景还是背景即可)。anchor有[x,y,w,h]四个坐标偏移量,x,y表示中心点坐标,w和h表示宽度和高度。这样,对于feature map上的每个点,就得到了k个大小形状各不相同的选区region。 对于生成的anchors,我们首先要判断它是前景还是背景。由于感兴趣的物体位于前景中,故经过这一步之后,我们就可以舍弃背景anchors了。大部分的anchors都是属于背景,故这一步可以筛选掉很多无用的anchor,从而减少全连接层的计算量。 对于经过了3x3的卷积后得到的256个feature map,先经过1x1的卷积,变换为18个feature map。然后reshape为一维向量,经过softmax判断是前景还是背景。此处reshape的唯一作用就是让数据可以进行softmax计算。然后输出识别得到的前景anchors。 另一路用来确定候选框的位置,也就是anchors的[x,y,w,h]坐标值。如下图所示,红色代表我们当前的选区,绿色代表真实的选区。虽然我们当前的选取能够大概框选出飞机,但离绿色的真实位置和形状还是有很大差别,故需要对生成的anchors进行调整。这个过程我们称为bounding box regression。 假设红色框的坐标为[x,y,w,h], 绿色框,也就是目标框的坐标为[Gx, Gy,Gw,Gh], 我们要建立一个变换,使得[x,y,w,h]能够变为[Gx, Gy,Gw,Gh]。最简单的思路是,先做平移,使得中心点接近,然后进行缩放,使得w和h接近。如下: 我们要学习的就是dx dy dw dh这四个变换。由于是线性变换,我们可以用线性回归来建模。设定loss和优化方法后,就可以利用深度学习进行训练,并得到模型了。对于空间位置loss,我们一般采用均方差算法,而不是交叉熵(交叉熵使用在分类预测中)。优化方法可以采用自适应梯度下降算法Adam。 得到了前景anchors,并确定了他们的位置和形状后,我们就可以输出前景的特征子图proposal了。步骤如下: 1,得到前景anchors和他们的[x y w h]坐标。 2,按照anchors为前景的不同概率,从大到小排序,选取前pre_nms_topN个anchors,比如前6000个 3,剔除非常小的anchors。 4,通过NMS非极大值抑制,从anchors中找出置信度较高的。这个主要是为了解决选取交叠问题。首先计算每一个选区面积,然后根据他们在softmax中的score(也就是是否为前景的概率)进行排序,将score最大的选区放入队列中。接下来,计算其余选区与当前最大score选区的IOU(IOU为两box交集面积除以两box并集面积,它衡量了两个box之间重叠程度)。去除IOU大于设定阈值的选区。这样就解决了选区重叠问题。 5,选取前post_nms_topN个结果作为最终选区proposal进行输出,比如300个。 经过这一步之后,物体定位应该就基本结束了,剩下的就是物体识别了。 和fast R-CNN中类似,这一层主要解决之前得到的proposal大小形状各不相同,导致没法做全连接。全连接计算只能对确定的shape进行运算,故必须使proposal大小形状变为相同。通过裁剪和缩放的手段,可以解决这个问题,但会带来信息丢失和图片形变问题。我们使用ROI pooling可以有效的解决这个问题。 ROI pooling中,如果目标输出为MxN,则在水平和竖直方向上,将输入proposal划分为MxN份,每一份取最大值,从而得到MxN的输出特征图。 ROI Pooling层后的特征图,通过全连接层与softmax,就可以计算属于哪个具体类别,比如人,狗,飞机,并可以得到cls_prob概率向量。同时再次利用bounding box regression精细调整proposal位置,得到bbox_pred,用于回归更加精确的目标检测框。 这样就完成了faster R-CNN的整个过程了。算法还是相当复杂的,对于每个细节需要反复理解。faster R-CNN使用resNet101模型作为卷积层,在voc2012数据集上可以达到83.8%的准确率,超过yolo ssd和yoloV2。其最大的问题是速度偏慢,每秒只能处理5帧,达不到实时性要求。 针对于two-stage目标检测算法普遍存在的运算速度慢的缺点, yolo创造性的提出了one-stage。也就是将物体分类和物体定位在一个步骤中完成。 yolo直接在输出层回归bounding box的位置和bounding box所属类别,从而实现one-stage。通过这种方式, yolo可实现45帧每秒的运算速度,完全能满足实时性要求 (达到24帧每秒,人眼就认为是连续的)。它的网络结构如下图: 主要分为三个部分:卷积层,目标检测层,NMS筛选层。 采用Google inceptionV1网络,对应到上图中的第一个阶段,共20层。这一层主要是进行特征提取,从而提高模型泛化能力。但作者对inceptionV1进行了改造,他没有使用inception module结构,而是用一个1x1的卷积,并联一个3x3的卷积来替代。(可以认为只使用了inception module中的一个分支,应该是为了简化网络结构) 先经过4个卷积层和2个全连接层,最后生成7x7x30的输出。先经过4个卷积层的目的是为了提高模型泛化能力。yolo将一副448x448的原图分割成了7x7个网格,每个网格要预测两个bounding box的坐标(x,y,w,h)和box内包含物体的置信度confidence,以及物体属于20类别中每一类的概率(yolo的训练数据为voc2012,它是一个20分类的数据集)。所以一个网格对应的参数为(4x2+2+20) = 30。如下图 其中前一项表示有无人工标记的物体落入了网格内,如果有则为1,否则为0。第二项代表bounding box和真实标记的box之间的重合度。它等于两个box面积交集,除以面积并集。值越大则box越接近真实位置。 分类信息: yolo的目标训练集为voc2012,它是一个20分类的目标检测数据集 。常用目标检测数据集如下表: | Name | # Images (trainval) | # Classes | Last updated | | --------------- | ------------------- | --------- | ------------ | | ImageNet | 450k | 200 | 2015 | | COCO | 120K | 90 | 2014 | | Pascal VOC | 12k | 20 | 2012 | | Oxford-IIIT Pet | 7K | 37 | 2012 | | KITTI Vision | 7K | 3 | | 每个网格还需要预测它属于20分类中每一个类别的概率。分类信息是针对每个网格的,而不是bounding box。故只需要20个,而不是40个。而confidence则是针对bounding box的,它只表示box内是否有物体,而不需要预测物体是20分类中的哪一个,故只需要2个参数。虽然分类信息和confidence都是概率,但表达含义完全不同。 筛选层是为了在多个结果中(多个bounding box)筛选出最合适的几个,这个方法和faster R-CNN 中基本相同。都是先过滤掉score低于阈值的box,对剩下的box进行NMS非极大值抑制,去除掉重叠度比较高的box(NMS具体算法可以回顾上面faster R-CNN小节)。这样就得到了最终的最合适的几个box和他们的类别。 yolo的损失函数包含三部分,位置误差,confidence误差,分类误差。具体公式如下: 误差均采用了均方差算法,其实我认为,位置误差应该采用均方差算法,而分类误差应该采用交叉熵。由于物体位置只有4个参数,而类别有20个参数,他们的累加和不同。如果赋予相同的权重,显然不合理。故yolo中位置误差权重为5,类别误差权重为1。由于我们不是特别关心不包含物体的bounding box,故赋予不包含物体的box的置信度confidence误差的权重为0.5,包含物体的权重则为1。 Faster R-CNN准确率mAP较高,漏检率recall较低,但速度较慢。而yolo则相反,速度快,但准确率和漏检率不尽人意。SSD综合了他们的优缺点,对输入300x300的图像,在voc2007数据集上test,能够达到58 帧每秒( Titan X 的 GPU ),72.1%的mAP。 SSD网络结构如下图: 和yolo一样,也分为三部分:卷积层,目标检测层和NMS筛选层 SSD论文采用了VGG16的基础网络,其实这也是几乎所有目标检测神经网络的惯用方法。先用一个CNN网络来提取特征,然后再进行后续的目标定位和目标分类识别。 这一层由5个卷积层和一个平均池化层组成。去掉了最后的全连接层。SSD认为目标检测中的物体,只与周围信息相关,它的感受野不是全局的,故没必要也不应该做全连接。SSD的特点如下。 每一个卷积层,都会输出不同大小感受野的feature map。在这些不同尺度的feature map上,进行目标位置和类别的训练和预测,从而达到 多尺度检测 的目的,可以克服yolo对于宽高比不常见的物体,识别准确率较低的问题。而yolo中,只在最后一个卷积层上做目标位置和类别的训练和预测。这是SSD相对于yolo能提高准确率的一个关键所在。 如上所示,在每个卷积层上都会进行目标检测和分类,最后由NMS进行筛选,输出最终的结果。多尺度feature map上做目标检测,就相当于多了很多宽高比例的bounding box,可以大大提高泛化能力。 和faster R-CNN相似,SSD也提出了anchor的概念。卷积输出的feature map,每个点对应为原图的一个区域的中心点。以这个点为中心,构造出6个宽高比例不同,大小不同的anchor(SSD中称为default box)。每个anchor对应4个位置参数(x,y,w,h)和21个类别概率(voc训练集为20分类问题,在加上anchor是否为背景,共21分类)。如下图所示: 另外,在训练阶段,SSD将正负样本比例定位1:3。训练集给定了输入图像以及每个物体的真实区域(ground true box),将default box和真实box最接近的选为正样本。然后在剩下的default box中选择任意一个与真实box IOU大于0.5的,作为正样本。而其他的则作为负样本。由于绝大部分的box为负样本,会导致正负失衡,故根据每个box类别概率排序,使正负比例保持在1:3。SSD认为这个策略提高了4%的准确率 另外,SSD采用了数据增强。生成与目标物体真实box间IOU为0.1 0.3 0.5 0.7 0.9的patch,随机选取这些patch参与训练,并对他们进行随机水平翻转等操作。SSD认为这个策略提高了8.8%的准确率。 和yolo的筛选层基本一致,同样先过滤掉类别概率低于阈值的default box,再采用NMS非极大值抑制,筛掉重叠度较高的。只不过SSD综合了各个不同feature map上的目标检测输出的default box。 SSD基本已经可以满足我们手机端上实时物体检测需求了,TensorFlow在Android上的目标检测官方模型ssd_mobilenet_v1_android_export.pb,就是通过SSD算法实现的。它的基础卷积网络采用的是mobileNet,适合在终端上部署和运行。 针对yolo准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,提出了yoloV2。它主要还是采用了yolo的网络结构,在其基础上做了一些优化和改进,如下 网络采用DarkNet-19:19层,里面包含了大量3x3卷积,同时借鉴inceptionV1,加入1x1卷积核全局平均池化层。结构如下 yolo和yoloV2只能识别20类物体,为了优化这个问题,提出了yolo9000,可以识别9000类物体。它在yoloV2基础上,进行了imageNet和coco的联合训练。这种方式充分利用imageNet可以识别1000类物体和coco可以进行目标位置检测的优点。当使用imageNet训练时,只更新物体分类相关的参数。而使用coco时,则更新全部所有参数。 YOLOv3可以说出来直接吊打一切图像检测算法。比同期的DSSD(反卷积SSD), FPN(feature pyramid networks)准确率更高或相仿,速度是其1/3.。 YOLOv3的改动主要有如下几点: 不过如果要求更精准的预测边框,采用COCO AP做评估标准的话,YOLO3在精确率上的表现就弱了一些。如下图所示。 当前目标检测模型算法也是层出不穷。在two-stage领域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 算法,将对抗学习引入到目标检测领域。Face++也提出了Light-Head R-CNN,主要探讨了 R-CNN 如何在物体检测中平衡精确度和速度。 one-stage领域也是百花齐放,2017年首尔大学提出 R-SSD 算法,主要解决小尺寸物体检测效果差的问题。清华大学提出了 RON 算法,结合 two stage 名的方法和 one stage 方法的优势,更加关注多尺度对象定位和负空间样本挖掘问题。 目标检测领域的深度学习算法,需要进行目标定位和物体识别,算法相对来说还是很复杂的。当前各种新算法也是层不出穷,但模型之间有很强的延续性,大部分模型算法都是借鉴了前人的思想,站在巨人的肩膀上。我们需要知道经典模型的特点,这些tricks是为了解决什么问题,以及为什么解决了这些问题。这样才能举一反三,万变不离其宗。综合下来,目标检测领域主要的难点如下: 一文读懂目标检测AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2 从YOLOv1到v3的进化之路 SSD-Tensorflow超详细解析【一】:加载模型对图片进行测试https://blog.csdn.net/k87974/article/details/80606407 YOLOhttps://pjreddie.com/darknet/yolo/ https://github.com/pjreddie/darknet C#项目参考:https://github.com/AlturosDestinations/Alturos.Yolo 项目实践贴个图。
目标检测算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)

一文帮你搞定Yolov3

我们知道传统机器学习中如果要预测出一条短信是否为垃圾短信,我们会把很多条短信拿来做训练样本,然后每条短信的标签是用0和1来标注他是否为垃圾短信。通过将这些训练样本及对应的标签输入到机器学习模型中,使得模型能够学习怎样判别一条短信是否为垃圾短信,从而当随便拿一条短信输入到模型中,就能判断这个短信是否为垃圾短信了。 Yolov3算法的训练方法与传统机器学习算法训练的本质是一样的。 Yolov3中用来训练的样本实际上是一群框,yolov3通过训练这群样本框,让模型能够学习到如何将这群样本框挪动位置来框住图片中真实的物体。从而当随便拿一张图片,yolov3都能将这张图片中的物体给框住,并判断其类别。 这群样本框是怎么定义的,这群框的样本标签又该如何定义,我们接下来给大家介绍。 Yolov3的多尺度预测 Yolov3通过对图片卷积提取特征后会得到三个尺度的feature map,这三个尺度的feature map分别是13*13,26*26,52*52.然后对每个feature map的每个cell下分配三个anchor box,anchor box的尺寸有(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)这九种。怎么把这9个anchor box分配给3个feature map.我们可以通过如下分析得到:(10*13),(16*30),(33*23)属于小尺度的anchor box,主要用于检测小尺寸的物体,而feature map中52*52的感受野最小,适合检测小的物体,所以把(10*13),(16*30),(33*23)分配给52*52的feature map,(30x61),(62x45),(59x119)属于中等尺度的anchor box,主要用于检测中等尺寸的物体,所以把他分配给26*26(负责检测中等尺寸物体的feature map),(116x90),(156x198),(373x326)属于较大尺度的anchor box,主要用于检测较大尺寸的物体,所以把他分配给13*13(负责检测较大尺寸物体的feature map)的feature map.将上述anchor box分配好后,我们可以利用公式计算出anchor box在原图中的位置。这群在三个feature map的每一个cell下的anchor box,实际上就是我们模型的训练样本。如果将这群anchor box都还原回原图,每张图片上差不多有1万多个anchor box.我们都知道训练样本是要有样本标签的,那么yolov3是如何给训练样本(这群anchor box)打上标签呢? 如何给样本打标签 但是每张图片上就有1万多个anchor box,而且一张图片上可能有多个gt box.gt box就是我们对图片中标记的样本框。如果每一个anchor box都要打上gt box的标签,就会有两个问题,其一:anchor box与gt box之间如何对应?其二:每一张图片有一万多anchor box要训练,yolov3算法效率岂不太低。 为此yolov3采用了中心负责制,即gt box中心落在哪个cell,就由该cell上面的某个anchor box用来负责预测该gt box中的物体。 注意:不是每个cell下面都有3个anchor box吗,为什么只由某个anchor box负责预测该gt box呢?其实,这也很好解释,如果对一堆anchor box做位置移动,使其接近gtbox。那么肯定是与gt box重合度高的anchor box在做适当的坐标修正后比较接近该gt box.因此,每个gt box都要与anchor box计算交并比,找到与其交并比最大的anchor box来负责预测该gt box. 那具体来说一下操作流程: 首先生成13*13*3*(80+5),26*26*3*(80+5),52*52*3(80+5)这样维度大小的三个零矩阵。 对训练样本图片做循环,在每次循环中再对gtbox做循环,在每次gtbox循环中再对9个anchor box做循环。举个例子,有10张图片,每张图片上有3个gtbox(这个gtbox就是我们对样本图片上的物体进行标注的框),用9个anchor box与gt box计算iou,找到最大的iou对应的anchor box.例如,第四个anchor box与gt box的iou最大,而我们已经知道第四个anchor box分配给了26*26的feature map.所以当前这个gt box中的物体由26*26这个feature map中某个cell中的anchor box负责预测。 怎么找到这个cell呢? 将gt box所在的原图image划分成26*26的网格,看gt box的中心落在哪个cell上,feature map上对应的那个cell就负责预测这个gtbox中的物体。假设中心落在第四行第三列上。 那么图片中该gtbox中的物体由26*26的feature map中的(4,3)的这个cell里面的第一个anchor box来预测。因此我们只用将该gtbox的坐标,类别,置信度填入该anchor box 对应的位置就好了,因为这是我们的anchor box要达到的目标。注意:我们填入的并不是gt box的坐标,而是gt box与anchorbox的坐标之间通过编码公式换算出来的一种值。而第二个anchor box与第三个anchor box不负责预测物体,所以全部填0. Yolov3的预测值 Yolov3中的预测值在3个feature map与3*3的filter卷积得到的结果中取得。以26*26的feature map为例,26*26*256的feature map和3*3*256*(3*85)做卷积运算,输出26*26*(3*85)的预测值.这个85中80是预测的anchor box中属于每一类别的概率,4是gtbox与anchor box之间的偏移量,1是置信度,是这个anchor box中有无物体的概率和anchor box与其对应的gt box之间iou的乘积。 损失计算 上面将yolov3的样本标签,及每个样本的预测值做了解释,接下来就是如何计算损失了。Yolov3的损失函数包括三部分,坐标损失,置信度损失和分类损失。把样本分为了正负样本。 通常我们把不需要负责预测物体的anchorbox称作负样本。负样本不需要计算坐标损失和分类损失,只需要计算置信度损失,而负样本的置信度的目标值是0,就是说我这个框的置信度目标的预测值接近0,就是让算法去学习让这个框不包含物体。 而把需要负责预测物体的anchorbox称作正样本,正样本需要计算坐标损失,置信度损失和分类损失。 正负样本的区分 在yolov3中我们把anchor box样本分为正样本,负样本和忽略样本。anchor box样本标签中置信度为1的anchor box,称为正样本,置信度为0的anchor box,称为负样本。忽略样本则是从负样本中抽取出来的,如何理解呢? 由于yolov3使用了多尺度预测,不同尺度的特征图之间可能会出现重复检测的部分。例如有一个物体狗的gt box在训练时与13*13的feature map中的某个anchor box对应。此时在训练模型的预测值中,恰好26*26的feature map中的某个anchor box与该gtbox的iou达到0.93。而模型中我们让这个anchor box的置信度标签为0,网络学习结果肯定会不理想。所以我们的处理办法是,将这种与gtbox之间 iou较大(大过设定的阈值,如0.5),但又不负责预测物体的anchor box称之为忽略样本,不纳入损失计算。 在负样本中挖掘出忽略样本的步骤如下: 让所有的预测的缩放比(tx,ty,tw,th)与对应的anchorbox 进行解码,得到对应的预测框,我们称为bbox. 让这些bbox与当前预测的图片上的所有gtbox (假设有v个)计算交并比,就可以让每个bbox有对应的v个分数。对每个预测框取v个分数中的最大值,即可以得到best_score,这个best_score就是与这个anchor box交并比最大的那个gt box,他们之间的交并比。 将anchor box置信度标签为0,但best_score>阈值的部分设置为忽略样本,不参与损失计算。 而anchor box置信度标签为0,但best_score<阈值的部分才是参与损失计算的负样本。 2.Yolov3的预测流程 预测流程: 模型输出三种尺度的预测结果,分别为13*13*3*(80+5),26*26*3*(80+5),52*52*3(80+5)。此处以batch*13*13*(3*85)为例进行说明。 将输出的batch*13*13*(3*85),用输出的置信度和类别概率相乘,得到筛选各个bbox框的score值。 对筛选的物体检测框,进行非极大值抑制算法来删掉对同一类物体重合度较高的框,然后选出最后的最优框。 非极大值抑制的计算步骤: 1:设置阈值 2:对每类对象 2.1:选取该类中概率最大的框,然后用这个框与该类中的其他框计算iou,iou大于阈值则剔除,把这个最大的框放入输出列表中,这个最大的框也剔除出去 2.2:在余下的该类框中再选出概率最大的框,重复2.1的操作 2.3:返回步骤2,继续下一类对象
一文帮你搞定Yolov3

YOLOv3详解

YOLO是“You Only Look Once”的简称,它虽然不是最精确的算法,但在精确度和速度之间选择的折中,效果也是相当不错。YOLOv3借鉴了YOLOv1和YOLOv2,虽然没有太多的创新点,但在保持YOLO家族速度的优势的同时,提升了检测精度,尤其对于小物体的检测能力。YOLOv3算法使用一个单独神经网络作用在图像上,将图像划分多个区域并且预测边界框和每个区域的概率。 YOLOv3仅使用卷积层,使其成为一个全卷积网络(FCN)。文章中,作者提出一个新的特征提取网络,Darknet-53。正如其名,它包含53个卷积层,每个后面跟随着batch normalization层和leaky ReLU层。没有池化层,使用步幅为2的卷积层替代池化层进行特征图的降采样过程,这样可以有效阻止由于池化层导致的低层级特征的损失。Darknet-53网络如下图左边所示。 输入是。输出是带有识别类的边界框列表,每个边界框由六个参数表示。如果表示80个类别,那么每个边界框由85个数字表示。在YOLO中,预测过程使用一个卷积,所以输入是一个特征图。由于使用卷积,因此预测图正好是特征图大小(卷积只是用于改变通道数)。在YOLOv3中,此预测图是每个cell预测固定数量的边界框。如上图所示,预测图的深度为75,假设预测图深度为,表示每个cell可以预测的边界框数量。这些个边界框可以指定检测到一个物体。每个边界框有个特征,分别描述中心点坐标和宽高(四个)和物体分数(一个)以及个类置信度(上图中)。YOLOv3每个cell预测三个边界框。如果对象的中心(GT框中心)落在该cell感受野范围内,我们希望预测图的每个单元格都能通过其中一个边界框预测对象。其中只有一个边界框负责检测物体,首先我们需要确定此边界框属于哪个cell。为了实现上面的想法,我们将原始图像分割为最后预测图维度大小的网格。如下图所示,输入图像维度为,步幅为32(最后的预测图降采样32倍),最后预测图维度为,所以我们将原始图像划分为的网格。 直接预测框的宽高会导致训练时不稳定的梯度问题,因此,现在的很多目标检测方法使用log空间转换或者简单的偏移(offset)到称为锚框的预定义默认边界框。然后将这些变换应用到锚框以获得预测,YOLOv3具有三个锚框,可以预测每个单元格三个边界框。锚框是边界框的先验,是使用k均值聚类在COCO数据集上计算的。我们将预测框的宽度和高度,以表示距聚类质心的偏移量。以下公式描述了如何转换网络输出以获得边界框预测: 这里分别是我们预测的中心坐标、宽度和高度。是网络的输出。是网格从顶左部的坐标。是锚框的维度(见下图)。 通过sigmoid函数进行中心坐标预测,强制将值限制在0和1之间。YOLO不是预测边界框中心的绝对坐标,它预测的是偏移量:相对于预测对象的网格单元的左上角;通过特征图cell归一化维度。例如,考虑上面狗的图像。如果预测中心坐标是,意味着中心在(因为红色框左上角坐标是)。但是如果预测的坐标大于1,例如,意味着中心在,现在中心在红色框右边,但是我们只能使用红色框对对象预测负责,所以我们添加一个sidmoid函数强制限制在0和1之间。 通过对输出应用对数空间转换,然后与锚框相乘,可以预测边界框的尺寸(如上面的计算公式)。 物体分数表示一个边界框包含一个物体的概率,对于红色框和其周围的框几乎都为1,但边角的框可能几乎都为0。物体分数也通过一个sigmoid函数,表示概率值。类置信度表示检测到的物体属于一个具体类的概率值,以前的YOLO版本使用softmax将类分数转化为类概率。在YOLOv3中作者决定使用sigmoid函数取代,原因是softmax假设类之间都是互斥的,例如属于“Person”就不能表示属于“Woman”,然而很多情况是这个物体既是“Person”也是“Woman”。 为了识别更多的物体,尤其小物体,YOLOv3使用三个不同尺度进行预测(不仅仅只使用)。三个不同尺度步幅分别是32、16和8。这意味着,输入图像,检测尺度分别为、和(如下图或者更详细如图2所示)。YOLOv3为每种下采样尺度设定3个先验框,总共聚类9个不同尺寸先验框。在COCO数据集上9个先验框分别是:。下表是9个先验框分配情况: 我们的网络生成10647个锚框,而图像中只有一个狗,怎么将10647个框减少为1个呢?首先,我们通过物体分数过滤一些锚框,例如低于阈值(假设0.5)的锚框直接舍去;然后,使用NMS(非极大值抑制)解决多个锚框检测一个物体的问题(例如红色框的3个锚框检测一个框或者连续的cell检测相同的物体,产生冗余),NMS用于去除多个检测框。具体使用以下步骤:抛弃分数低的框(意味着框对于检测一个类信心不大);当多个框重合度高且都检测同一个物体时只选择一个框(NMS)。为了更方便理解,我们选用上面的汽车图像。首先,我们使用阈值进行过滤一部分锚框。模型有个数,每个盒子由85个数字描述。将分割为下面的形状:box_confidence:表示个cell,每个cell5个框,每个框有物体的置信度概率;boxes:表示每个cell5个框,每个框的表示;box_class_probs:表示每个cell5个框,每个框80个类检测概率。即使通过类分数阈值过滤一部分锚框,还剩下很多重合的框。第二个过程叫NMS,里面有个IoU,如下图所示。 下图给出更加详细的输入输出情况: 文章原文:https://medium.com/analytics-vidhya/yolo-v3-theory-explained-33100f6d193 论文原文:https://pjreddie.com/media/files/papers/YOLOv3.pdf YOLOv3深入理解:https://www.jianshu.com/p/d13ae1055302 keras实现YOLOv3博客:https://blog.csdn.net/weixin_44791964/article/details/103276106 What new in YOLOv3?:https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b
YOLOv3详解

yolov3什么时候出来的

yolo v3是2018年出来的,比SSD和retinanet都要晚,在map0.5这个指标上速度比SSD和retinanet快很多。在工业应用上面map0.5已经满足使用,并且yolo v3简介,文档丰富,还有tiny版本等一些列变种。最重要的是速度非常快,比SSD和retinanet都要快。 YOLOv3 的提出不是为了解决什么问题,整篇论文其实是技术报告。YOLOv3 在 YOLOv2 基础上做了一些小改进,文章篇幅不长,核心思想和 YOLOv2、YOLO9000差不多。 模型改进: 边界框预测:定位任务采用 anchor box 预测边界框的方法,YOLOv3 使用逻辑回归为每个边界框都预测了一个分数 objectness score,打分依据是预测框与物体的重叠度。如果某个框的重叠度比其他框都高,它的分数就是 1,忽略那些不是最好的框且重叠度大于某一阈值(0.5)的框。
yolov3什么时候出来的

Yolov3理论详解

Yolo系列采用了one-stage的识别方案,故名思意,就是一个阶段,图像进来之后,卷积提取特征,到和labels计算损失,他就一个阶段。相教于fasterrcnn,masterrcnn等需要生成大量候选框的two-stage方案,在识别速度上还是比较到位的,这样就使得它非常的实用,传说被美军应用在了导弹识别方面,传说的很玄乎,也确实,无论在速度还是准确率,yolov3都做的非常不错。 我们看下yolov3的结构,先附上一张整体结构图。 从上到下我们走一遍YOLOV3流程。 1.A位置,当图像输入进来以后,图像的尺寸并不是正方形的,为了后面的计算方便,我们首先把他转换成能被32整除的正方形。为什么是32,整个网络要经过16次放缩变换(步长为2的卷积操作{替代池化}),最后得到的特征图尺寸是11*11 或者12*12或者14*14这样的方格。每次转换称的正方形图像并不是固定尺寸,这样就增强了网络适应不同大小图像的能力. 2.B位置,  一个conv2d是Convolution卷积+Batch Normalization+Leaky_relu激活的组合。Batch Normalization归一化替代正则,提升模型收敛速度。Leaky_relu软路激活解决了relu激活时负数不学习的问题。 从A位置进来416*416*3的图像,经过了32(32个卷积核)*3*3(卷积核的尺寸3*3) 步长为1的卷积操作之后,变成了416*416*32的输出。 3.B到C过程中,我们看到图像尺寸从416*416转换成208*208,中间有一层步长为2的卷积层,来替代池化层。比单纯的用池化层效果要好一些。 4.C位置,这里是卷积和残差连接的组合,yolov3的残差连接是同模块内的残差连接,shape相同才能连接。 C位置以下的resnet层 ,我们就不再说明了,原理和连接都是一致的。越往下,特征图的尺寸约小,特征核的层数越多。 5.我们看下E位置的尺寸是13*13*1024,D位置的尺寸是26*26*512 ,越往下的层越能识别大物体,而上面的层越能识别小物体,我们把上下两层相加,使得它同时具备了识别大物体和小物体的能力。上下两层即E层和D层怎么融合呢,我们把E层上采样,变成26*26*256,这样他就能和D层首尾相连进行拼合了。 6.拼合以后我们看到到了F位置,注意F位置的尺寸  (batch_size,26,26,75),分类数是 70 ,这里却是75,多出来的五个就是,x,y,w,h,conf(是物体与不是物体的判断)。 7.YOLO层是一个预测值和Lables目标值相减求损失的层。 yolov3一共有三个YOLO层分别去训练网络,为什么有三个,较小的特征图有比较大的视野,教大的特征图有比较小的视野,这样yolo3就拥有了既能识别大目标也能识别小目标的能力,同时,一个点既能是一种分类,也可以属于另外的分类. 8.好了,pytorch执行loss.back(),反向传播,就开始训练了。
Yolov3理论详解

转载请注明出处短句子网 » yolov3(yolov3训练自己的数据超详细)

诗句

抖音上很火的个性签名(抖音上很火的个性签名霸气)

阅读(468)

抖音个性签名霸气独特超吸粉 2020抖音求关注吸引人个性签名 1:不好意思啊刚认识就喜欢你 2:眼睛为她下着雨,心却为她打着伞这就是爱情 3:社交之所以有时候会让人觉得烦大多是因为社交中的人们大都在努力表现着自己所不具备的优良...

诗句

激励人成功语录(激励女人打扮美的语录)

阅读(404)

无论是阳光彩虹,还是狂风暴雨,都要把自己武装好,因为谁都不知道接下来会发生的是什么。以下是我为大家整理的成功励志语录,希望对你有帮助。1. 只有不断找寻机会的人才会及时把握机会。2. 欲望以提升热忱,毅力以磨平...

诗句

经典精辟短句(精辟的句子经典短句)

阅读(690)

1. 求10句经典的句子,名言 经典语句1、记住该记住的,忘记该忘记的。 改变能改变的,接受不能改变的。 2、能冲刷一切的除了眼泪,就是时间,以时间来推移感情,时间越长,冲突越淡,仿佛不断稀释的茶。 3、怨言是上天得至人类最大的供...

诗句

表达思念牵挂的句子(思念诗句牵挂一个人)

阅读(523)

表达思念牵挂的句子有:1、秋天代表思念,落叶过后变成了曾经,我们只有回忆。2、当回忆沉默。心也就没了。当思念沉淀。梦也就碎了。3、如果累了,就选择忘掉,不要让思念变成毒药,不要让记忆斩断心肠,让我一个人哭到...

诗句

鲁迅经典10句话(鲁迅最经典的句话)

阅读(754)

“哀其不幸,怒其不争”。第八句话是:“所佩服你们的只有一点,就是这种东西,居然会有勇气拍出来”。第九句话是:“走自己的路,让别人说去吧”。第十句话是:“不在沉默中爆发,就在沉默中灭亡”。

诗句

清明节手抄报内容写什么(清明节手抄报内容写什么30字)

阅读(974)

一年级清明节手抄报内容:1、清明节来历 清明节,又叫踏青节,按阳历来说,它是在每年的4月4日至6日之间,正是春光明媚草木吐绿的时节,也正是人们春游的好时候,所以古人有清明踏青,并开展一系列体育活动的习俗。2、...

诗句

赞美秋天的句子大全(赞美秋天的唯美句子大全)

阅读(648)

43、秋天是画,是彩云,是流霞,是成熟,是收获。让我们赞美秋天,赞美丰收的图景,赞美这绚丽多姿的秋天风采,珍惜这“人到中年”的美好时光。 44、**仙子也毫不示弱,它们争奇斗艳。有的穿上了紫色的连衣裙,有的穿上了雪白的花裙子,有...

诗句

描写夏天的句子摘抄(描写夏天的句子摘抄50字)

阅读(1053)

描写夏天的好句摘抄 1、夏天里的太阳,就像一个大火球,热的让人无处躲闪。 2、那些铁器,被夏天的太阳一晒,就像一个个烤熟的红薯,让人不敢碰一下。 3、夏日炎炎,小鸟不知躲藏到什么地方去了;草木都低垂着头;小狗热得吐出舌头...

诗句

每天一则励志小故事(每天一则励志小故事50字)

阅读(964)

成功励志的小故事1:五枚金币 有个叫阿巴格的人生活在内蒙古草原上。有一次,年少的阿巴格和他爸爸在草原上迷了路,阿巴格又累又怕,到最后快走不动了。爸爸就从兜里掏出5枚硬币,把一枚硬币埋在草地里,把其余4枚放在...

诗句

祝福的话语送给朋友(日常祝福的话语送给朋友)

阅读(951)

导语:朋友是人生路上的宝贵财富,以下是为大家整理的祝福朋友的话语,希望能够帮助大家! 1、一份付出就有一分收获,一份能力就有一日出头,我的朋友,别忘记在你高升之时,我也为你感到快乐,恭喜你升职! 2、钱多钱少,常有就好;人丑人...

诗句

好词摘抄大全4字(好的词语摘抄 优美)

阅读(1101)

4字好词 1.车水马龙:形容繁华热闹。2.无间冬夏:无论冬天还是夏天。指一年四季从不间断。同“无冬无夏”。3.鼹鼠饮河:比喻小量,所取不多;或没什么了不起。4.抱头鼠窜:形容狼狈逃避的情形。5.豚蹄穰田:...

诗句

开心一刻幽默小笑话(小学生开心一刻幽默小笑话)

阅读(897)

1、本人女,老爸很疼我。一次老爸带我去买运动服,看上一套八百多的。老爸说:“喜欢哪种颜色,就都买。”最后买了三套。刷卡,出门,听见一售货MM弱弱的声音传来:“这二奶真丑!”2、蜘蛛要和蜜蜂结婚了。蜘蛛问他...

诗句

寓意好的成语(成语典故简短)

阅读(753)

寓意好的四字成语有:桃之夭夭、无所不晓、空谷幽兰、春色满园、福星高照等。一、桃之夭夭 [ táo zhī yāo yāo ]释义:喻事物的繁荣兴盛。亦形容逃跑。出处:《诗经·周南·桃夭》:“桃之夭夭,灼灼其华。”译文...