代码实现:https://editor.csdn.net/md/?articleId=105533555
Faster R-CNN系列:
1)two-state目标检测算法;
2)重用分类器执行检测:该系列的算法,首先产生候选区域 通过一些搜索算法(例select search算法)或者区域建议网络(RPN网络)产生候选区域。候选区域也就是目标可能存在于原图中的区域,用边界框来表示这个候选区域的位置信息,然后,分类器作用在这些候选区域 ,判断候选区域是否为目标,如果是目标还需要对候选区域的边界框进行后处理,来尽可能精确定位目标。
YOLOv1:
1) one-state目标检测的开山之作
2)将目标检测看做单一回归问题:直接从输入图像像素得到边界框坐标和类别概率。
1)速度快:
faster RCNN系列算法,网络分两阶段进行,先产生候选区域,对候选区域进行分类和后处理精修操作。
YOLO算法直接从图片回归目标位置和类别,通过单个阶段实现。更快
2)背景误检率低:
YOLO是在整个图像进行推断,在训练及测试期间会顾及整个图像,因此隐式的包含了目标的上下文信息及外观。
FasterRCNN系列采用候选区域技术,只能看到候选区域不会看到整个图像(更大的上下文),会将背景误检为目标。
3)YOLOv1能学到目标的泛化表征:
在自然图像上进行训练的模型,用艺术图像进行测试时,YOLOv1优于一些顶级算法,因为它有高度泛化的能力,因此在应用于新领域或意外的输入时不太可能出故障。
虽然能快速识别图像的目标,但是在精度上落后于当前先进的检测系统。 在定位目标尤其是小目标时精度不高
目标检测通过一个单一神经网络完成,网络使用整个图像的特征来预测每个边界框。
网络将图像分成S×S的网格,如果目标的中心落入某个网格单元,那个该网格单元就负责检测该目标。
每个网格单元输出:B个边界框对应的位置信息和这些边界框对应的置信度分数、C个条件类别概率 。
每个网格单元输出的长度为(B×5+C)
(1)每个边界框包含5个预测:x,y,w,h和置信度。
1.(x,y):表示边界框的中心相对于网格单元的边界的值
2.宽度w和高度h:表示相对于整张图的高和宽的预测;
3.置信度:表示预测框与任意实际边界框之间的IOU,如果不含目标则置信度=0
置信度分数反映了该边界框包含目标的信心,以及预测准确度的估量。置信度定义为:
即:如果网格单元中不存在目标则置信度=0,若存在目标置信度=预测框与真实框的IOU值。
(2)每个网格单元预测C个条件类别概率。
每个网格单元预测C个条件类别概率:
不管该网格单元预测的边界框B为多少,每个网格单元只预测一组类别概率。(数据集中所有类在该网格单元中出现的概率分布)
整个网络输出:所有网格单元输出构成的张量
例:Pascal VOC上评估YOLO,我们使用S=7,B=2。Pascal VOC有20个标注类,所以C=20。我们最终的预测是7×7×30的张量。
YOLOv1 网络有24个卷积层+2个全连接层。卷积层从图像中提取特征,而全连接层负责预测输出概率和坐标
预训练模型:
1.数据集:ImageNet的1000类竞赛数据集
2.预训练网络结构:YOLOv1网络的前20个卷积层+平均池化+全连接层
3.网络输入:224×224
训练检测模型:
1.改进预训练模型:在预训练模型的基础上,增加4个卷积层和两个全连接层,这些增加的层都经过随机初始化。
2.网络输入:检测需要细粒度视觉信息,因将网络输入由224×224改为448×448
模型最后一层:
模型最后一层为全连接层,预测类概率和边界框坐标。
通常通过图像的 宽度和高度来规范边界框的宽度和高度,使他们落在0-1之间。将边界框(x,y)坐标参数化为特定网格单元位置的偏移量,它的值被限定在0-1之间。
模型的最后一层使用线性激活函数,而所有其他的层使用如下激活函数:
模型损失函数:
损失函数理解:
(1)使用平方和误差:
平方和误差,易于优化,但是普通平方和误差中分类和定位误差的权重一样。
问题一:8维的localization error和20维的classification error重要程度不一样。更重视8维的定位预测,给定位损失赋予更大的权重:
问题二:图像中很多网格单元没有包含任何目标,这些网格单元的边界框的置信度分数为0,大量的这种网格单元会压制包含目标的网格单元的梯度,导致模型不稳定在训练早期就发散。因此对于没有目标的边界框,给置信度损失(IOU损失)赋予更小权重:
总结:改进后的平方和误差:增加边界框坐标预测的损失,减少了不包含目标的框的置信度预测损失。这种改进是通过使用两个参数进行权重的分配:
(2)符号:
每个目标只需要一个边界框预测器来负责。若某预测器的预测值与目标的实际值的IOU值最高,则这个预测器被指定为“负责”预测该目标。
代表第i个网格单元是否含有目标,有目标 则符号值=1,无目标 则符号值=0
代表第i个网格单元的第j个边界框对某目标负责,某边界框对目标负责时符号值=1
代表第i个网格单元的第j个边界框不负责目标,某边界框对目标不负责时 符号值=1
(3)坐标误差
平方和误差对大框和小框的误差权衡是一样的,而错误指标应该要体现出,大框的小偏差的重要性不如小框的小偏差重要性强。为了解决这个问题,误差计算的时候,直接计算边界框宽度和高度的平方根,而不是宽度和高度。
(4)IOU误差
主要是置信度的误差,因为置信度的计算受IOU值的影响,因此叫做IOU误差
(5)分类误差
分类误差与边界框无关只和网格单元有关,针对每个cell做概率的差值计算。
(1)得到网络输出:
输入图片,网络会按照与训练时相同的分割方式将测试图片分割成S x S的网格形状,每个网格单元预测输出C个条件类别概率、边界框位置信息和对应的置信度信息。所有网格单元的输出共同组成网络的输出。
例:Pascal VOC上评估YOLO,我们使用S=7,B=2。Pascal VOC有20个标注类,所以C=20。我们最终网络的输出是7×7×30的张量。
(2)获取预测
1.计算得分
根据网络输出进行操作:每个网格单元的 条件类别概率 × 每个边界框的置信度分数=得分
每个网格单元包含C个条件类别概率,C=20。
每个网格单元包含B个边界框对应的置信度分数,B=2。
得分体现了各类出现在边界框中的概率以及预测框拟合目标的程度。
本例中一张图片产生98个(7×7×2)边界框,对每个边界框进行上述运算(每个网格单元的条件类别概率 × 该网格单元的边界框的置信度分数),最后可以得到98个20维向量,20维是因为VOC有20个标注类C=20。
2.根据得分对每一类进行NMS
假设20维向量的第1维代表边界框针对狗这一类的得分,根据这一类进行NMS的步骤:
1)对98个边界框对应的20维向量按照第1维的得分值降序排序,将得分低于阈值的边界框重新赋值得分为0(这些边界框标记为已处理)
2)选出得分最高的边界框,确认其为正确预测(该边界框标记为已处理),并计算它与其它未被处理的边界框的IOU值
3)根据2中计算的IOU值,抑制IOU>threshold的边界框,得分置为0(这些边框标记为已处理)
4.对未处理的边界框,返回第1步,直到没有未处理的边界框为止
针对其他类别(20维向量的其他维),比如猫,车等,均采用这种方式进行NMS处理。
3.做出预测
对所有类进行NMS处理后,针对每一个边界框的20维得分向量,查看其最大的值,如果在20个值里面最大值非0,那么就把这个边界框认定为是识别对应物体的框。如果在20个值里面最大值为0,说明该框中不含任何目标,边界框作废。
总结:一些大的目标或接近多个网格单元边界的目标能被多个网格单元定位。非极大值抑制可以用来修正这些多重检测。非最大抑制对于YOLO的性能的影响不像对于R-CNN或DPM那样重要,但也能增加2−3%的mAP。
YOLO给边界框预测增加空间约束,因为每个网格单元只预测两个框且每个网格单元只能有一个类别。这个空间约束限制了模型可以预测的邻近目标的数量。 模型难以预测群组中出现的小物体(比如鸟群)。由于模型学习数据中预测边界框,因此它很难泛化到新的、不常见的长宽比或配置的目标
模型使用相对较粗糙的特征来预测边界框,因为输入图像在架构中历经了多个下采样层。
训练基于一个逼近检测性能的损失函数,这个损失函数无差别地处理小边界框与大边界框的误差。大边界框的小误差通常是无关要紧的,但小边界框的小误差对IOU的影响要大得多。主要错误来自于不正确的定位。
参考1:https://blog.csdn.net/weixin_42278173/article/details/81778217
参考2:https://blog.csdn.net/tianguiyuyu/article/details/81347846
代码实现:https://editor.csdn.net/md/?articleId=105533555