目录
- 简介
- YOLOv1
- YOLOv2
- YOLOv3
- 网络总结
简介
YOLO全拼是You Only Look Once。作者的目标是实现速度很快同时尽可能保持精度的目标检测网络,其去掉了非常耗时的生成RPN网络(对于实时检测的要求来说),直接把目标检测作为两个任务:目标区域预测、类别预测。实现了使用了一个网络直接预测物体边界和类别概率,即end-to-end,虽然精度与Two-Stage算法存在差距,但是从其速度和整体简洁程度上来说,其非常适合工程实现。
YOLO算法是一个系列,所以这里简要展示一下,之后具体分别介绍。
名称 | 速度 | 精度 |
---|---|---|
YOLOv1 | 45fps | 最低 |
YOLO9000 | 40fps | 普通 |
YOLOv3 | 51ms | 较高 |
YOLOv1
实现思路
- 将图像分成S x S个grid,如果一个目标的中心落入一个grid,此grid就负责检测该目标
- 每一个grid都预测B个标定框,其中每个框参数为( x , y , w , h , c o n f i d e n c e x, y, w, h, confidence x,y,w,h,confidence),其中 x , y x, y x,y代表相对grid的目标中心预测坐标, w , h w, h w,h代表目标框相对整个图像的预测宽高, c o n f i d e n c e ( 论 文 公 式 以 P r ( O b j e c t ) ∗ I O U p r e d t r u t h ) 表 示 confidence(论文公式以Pr(Object) * IOU_{pred}^{truth})表示 confidence(论文公式以Pr(Object)∗IOUpredtruth)表示代表预测的bbox的置信度
- 每一个grid还预测C个条件类别概率 P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(Classi∣Object),其中C是物体类别数量
- 这样在测试时每个条件类别概率可以乘以盒子的置信度得到分类别的置信度预测: P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h = P r ( C l a s s i ) ∗ I O U p r e d t r u t h Pr(Class_i|Object) * Pr(Object) * IOU_{pred}^{truth} = Pr(Class_i) * IOU_{pred}^{truth} Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
逻辑上如上图所示,可以看到最后预测数据是一个S x S x (B * 5 + C)的张量。至此预测部分到此结束。
网络结构
整个过程可以建模层回归问题,作者使用了卷积神经网络来实现。通过初始卷积层从图中提取特征,然后接全连接层来预测。
网络结构灵感来自GoogleLeNet模型,参数为S = 7,B = 2以及C = 20,所以最后数据格式为7 x 7 x 30。可以看出YOLOv1非常简洁。
损失函数
公式为:
L o s s = λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] + λ c o o r d ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 + λ n o o b j ∑ i = 0 S 2 ∑ j = 0 B 1 i j o b j ( C i − C ^ i ) 2 + ∑ i = 0 S 2 1 i o b j ∑ c ∈ c l a s s e s ( p i ( c ) − p ^ i ( c ) ) 2 Loss = \begin{aligned} \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^B 1_{ij}^{obj} [{(x_i - \hat{x}_i)}^2 + {(y_i - \hat{y}_i)}^2] \\ + \lambda_{coord} \sum_{i=0}^{S^2} \sum_{j=0}^B 1_{ij}^{obj} [{(\sqrt{w_i} - \sqrt{\hat{w}_i})}^2 + {(\sqrt{h_i} - \sqrt{\hat{h}_i})}^2] \\ + \sum_{i=0}^{S^2} \sum_{j=0}^B 1_{ij}^{obj} {(C_i - \hat{C}_i)}^2 \\ + \lambda_{noobj} \sum_{i=0}^{S^2} \sum_{j=0}^B 1_{ij}^{obj}{(C_i - \hat{C}_i)}^2 \\ + \sum_{i=0}^{S^2} 1_{i}^{obj} \sum_{c\in classes} {(p_i(c) - \hat{p}_i(c))}^2 \end{aligned} Loss=λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2]+λcoordi=0∑S2j=0∑B1ijobj[(wi