建议大家学习本博客相关YOLO系列之前,先了解一下基本的目标检查概念
YOLO系列属于一阶段算法中非常重要的算法,其应用极为广泛。本系列就从YOLOV1网络开始学习,主要记录一下个人认为值得关注和注意的点,以及和faster Rcnn和ssd有区分的点。
在yolov1中,并没有anchor这个概念。所以在v1的方法中设计到iou值都不是像faster rcnn那样,是真实框和anchor的交并比(IOU值就是两个框之间交集与并集的比值,也叫交并比),而是真实框和预测框的IOU。
在YOLOV1中,我们可以选择将图片分成大小为7*7的方格,当图片中物体中心点落在某一个方格时,就让该方格负责预测该物体。先假设,某一个方格有两个物体中心点在此处,那么对这一个方格而言,其所需要预测的输出向量维度为:预测的总类别数(VOC数据集就是20类) + 2 * (四个位置坐标信息 + 1个置信分数)。因为有两个物体中心点落在这个方格,因此就需要两个box预测框,每个box预测框需要五个参数,四个坐标信息,比如中心点坐标x,y , 宽度和高度等四个信息,这四个信息也和faster rcnn不同,这里是直接坐标,不是相对偏移量。第五个参数就是置信分数。故该方格一共需要输出向量长度为 20 + 2 (4 + 1)= 30; 一副图片分成49个单元格,故输出向量为(batch , 49, 30)。
置信分数是什么呢? 其实这里置信分数就和IOU相关,置信分数应该等于iou值乘以该预测框中有物体的概率。注意:这里是不看物体属于那一个类别的,只要有物体就算行。
在faster RCNN中,我们是直接给出预测类别概率和预测框的回归参数两类值。但是在yolov1中,我们刚刚说了,预测框不在给回归参数,而是直接预测准确位置,这也是yolov1准确率不高的原因之一吧。对于类别概率,yolov1也不是直接给出了,而是利用置信分数乘以框内有物体的情况下是具体某一类物体的概率值。我们把置信分数用公式写开,则输出概率变成了:
框内有物体的概率乘以在框内有物体的前提下是具体某一类物体的概率 在乘以 该框的iou值。因此,对于每一个框来说,都会输出一个长度为类别个数的预测概率向量。
以上这些理解了,这个网络是如何设计的,输入是什么形式,输出是什么形式的,输出每个参数代表什么,如果计算准确率等便都知道了。
网络的整体结构图如下(这个图并不是自己画的,而是在网络上找的图):
该网络架构就是基本的卷积池化操作,没有什么特殊性,仅仅在最后有一个fc(1470),这个1470怎么来的呢?取决于你想要每个单元格预测多少框,如果还是两个框,那对于voc数据集20分类来说,每个单元格输出维度长是30,每张图片49个单元格,所以输出总数为49 * 30 = 1470。
该网络损失由三部分组成,类别损失,回归框损失,以及置信分数损失。
classes损失就是用预测的20个种类可能性 减去 该图片单元格内真实物体的可能性,然后平方求得。比如在本单元格内有两个物体中心点落入,则只需要将这两个物体对应位置设置为1,其它设置为0.然后拿预测生成的概率减去真实标签概率,平方求和即可。
confidence损失同理,如果本单元格是正样本,正好预测物体,那confidence就是1,否则是0。然后用生成的confidence减去真实的0,1后平方求和。
bounding box损失就是四个坐标损失,难理解的地方就是为什么在w和h上要先开方?因为对于大小不同的物体而言,x,y移动相同距离,其预测偏差可不能当作相同,对小物体来说预测偏差会明显大于大物体。因此我们对w,h进行开方后使用,减少物体大小这种情况对结果的影响。
YOLOv1缺点:
1、直接预测框位置,这种做法偏差太大,应该学习两阶段算法中预测偏移量的做法。
2、对小目标不友好。