2019/04/08算法
yolo系列网络
在不专注的模型中,每一个检测器应该可以处理图像中任何可能位置的各种物体;致使单个检测器趋向检测全部边界框,最终检测框结果趋向于折中的位置。ide
使用固定网格上的检测器是one-stage目标检测算法的主要思想,也是它们与基于候选框的目标检测方法(如R-CNN)的区别所在(实际上Faster R-CNN中RPN网络也采用网格检测)。函数
使用网格来专门限制检测器仅查看某个特定空间位置。相应地,为每一个网格单元设置几个不一样的检测器,咱们可使这些物体检测器中的每个都专一于某种物体形状。学习
SSD不使用k-means来肯定先验框。相反,它使用数学公式来计算先验框尺寸,所以SSD的先验框与数据集无关(SSD称它们为“default boxes”);YOLO经过k-means聚类获得。this
YOLO模型的一个重要特色是仅当某个物体的中心点落在一个检测器的网格单元中心时,这个检测器才负责预测它。这样避免冲突,即相邻的单元格不会用来预测同一个物体。这样,delta_x和delta_y必须限制在0~1之间,表明预测框在网格单元的相对位置,这里用sigmod函数限制值的范围。.net
除了采用softmax,还能够采用sigmoid,这将变成一个多标签分类器,每一个预测框实际上能够同时有多个类别,SSD和YOLOv3是这样。可是SSD没有预测置信度,它给分类器增长了一个特殊的类:背景。若是分类结果是背景,那么意味着检测器没有找到物体,这实际上等价于YOLO给出一个较低的置信度。(YOLOv3和SSD采用不一样的方式,它们将这个问题当作多标签分类问题。因此不采用softmax(它致使各个类别互斥),反而使用sigmoid,这样容许预测多个标签。进一步,它们采用标准的二元交叉熵计算loss。)设计
YOLO必须从单个网格进行全部预测,因此它使用的先验框的范围从小(大约单个网格单元的大小)到大(大约整个图像的大小);与YOLO不一样的是,SSD不使用先验框来使检测器专一于物体大小,而是使用不一样的网格来实现这一点。SSD的先验框主要用于使检测器处理物体形状(长宽比)的变化,而不是它们的大小。code
旋转也是一种常见的数据扩增技术,但这会比较麻烦,由于咱们还须要同时旋转边界框,因此一般不会这样作。对象
YOLO的解决方案比较粗暴:每次随机打乱真实框,每一个单元只选择第一个进入它中心的物体。所以,若是一个新的真实框与一个已经负责另外一个物体的单元相匹配,那么咱们就只能忽略它了。这意味着在YOLO中,每一个单元至多有一个检测器被匹配到物体,而其余检测器不该该检测到任何东西(若是检测到了,就会受到惩罚)。 这只是YOLO的策略,SSD的匹配策略却不相同。SSD能够将同一个真实框与多个检测器匹配:首先选择具备最佳IOU值的检测器,而后选择那些与之IOU超过0.5的可是未被匹配过的检测器(注意检测器和先验框是绑定的,一一对应,因此说IOU指的是检测器的先验框与物体的边界框之间的重叠)。这应该使模型更容易学习,由于它没必要在哪一个检测器应该预测这个对象之间进行惟一选择,毕竟多个检测器能够预测这个对象。 注意:二者设计彷佛是矛盾的。YOLO将一个物体只分配给一个检测器(而该单元的其余检测器则是无物体),以帮助检测器更专一。可是SSD说多个检测器能够预测同一个物体。二者实际上均可以。对于SSD,检测器专一于形状而不是大小。
YOLO还有一个特别处理之处。若是一个检测器的预测框与全部真实框的IOU最大值大于一个阈值(好比0.6),那么忽略这个检测器的no_object_loss。换句话说,若是一个检测器被认为不该该预测一个物体,可是实际上却预测了一个不错的结果,那么最好是忽略它(或者鼓励它预测物体,也许咱们应该让这个检测器与这个物体匹配)。
注意:YOLO采用平方和偏差(sum-squared error,SSE),而不是常见的用于回归的均方差(mean-squared error,MSE),或是用于分类的交叉熵。一个可能缘由是每张图片物体数量并不一样,若是取平均,那么包含10个物体的图片与包含1个物体的图片的loss的重要性同样,而采用求和,前者的重要性约是后者的10倍,这可能更公平。
在目标检测中,分类器会给每一个bounding box(bb)计算出一个class score,就是这个bb属于每一类的几率,NMS就是根据这些值来进行的,主要流程: 对于每一类,首先把全部score<thresh1的bb的score设为0 以后,将全部的bb按照得分排序,选中最高分及其对应的bb 遍历其他的bb,若是和当前最高分bb的重叠面积(IoU)大于必定的阀值,便将该bb删除 从未处理的bb中继续选择一个最高分的bb,重复上述过程 重复上述过程,直到找到所有保留的bb 而后根据全部保留bb的class score和class color画出最后的预测结果
sort the predictions by confidence score (high to low) for each prediction: true_boxes = get the annotations with same class as the prediction and that are not marked as "difficult" find IOUs between true_boxes and prediction choose ground-truth box with biggest IOU overlap if biggest IOU > threshold (which is 0.5 for Pascal VOC): if we do not already have a detection for this ground-truth box: TP += 1 else: FP += 1 else: FP += 1