经典的one—stage方法
把检测问题转化成回归问题,一个CNN即可搞定
可以对视频进行实时检测
核心思想:
- 将图片划分成 S ∗ S S*S S∗S个网格( g r i d c e l l grid cell gridcell), o b j e c t object object的中心点落在哪个网格即由哪个网格负责预测该 o b j e c t object object,每个网格要预测 B B B个 B o u n d i n g B o x e s Bounding Boxes BoundingBoxes和 C C C个类别的概率,其中每个 B o u n d i n g B o x BoundingBox BoundingBox包含预测的位置信息和一个 c o n f i d e n c e confidence confidence。
- 每个 B o u n d i n g b o x Bounding box Boundingbox有 5 5 5个预测值: 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)坐标表示长方体相对于网格单元边界的中心, w , h w,h w,h分别是宽度和高度。
-
c
o
n
f
i
d
e
n
c
e
confidence
confidence反映了所预测的
b
o
x
box
box中含有
o
b
j
e
c
t
object
object的置信度和这个
b
o
x
box
box预测的精确度。如果该单元网格中不存在对象,则第一项(置信度)为0,否则取1。第二项是预测的
b
o
x
box
box和实际的
g
r
o
u
n
d
t
r
u
t
h
groundtruth
groundtruth之间的
I
o
U
IoU
IoU值。
c
o
n
f
i
d
e
n
c
e
confidence
confidence就是这两项的乘积。
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^{truth}_{pred} confidence=Pr(Object)∗IOUpredtruth - 每个网格单元还要预测C个类别信息。因此,一个S×S网格,每个网格单元需要预测B个bounding box和C个类别信息。输出为S×S×(5×B+C)的一个tensor
- 将整个图片作为网格的输入,直接在输出层对 B o u n d i n g B o x Bounding Box BoundingBox的位置和类别进行回归
相关参数:
b o x ( x , y , w , h ) box(x,y,w,h) box(x,y,w,h)x,y不直接回归中心点坐标数值,而是回归相对于网格格点左上角坐标的位移值(offset),将其归一化到0-1之间;w,h用图像的width和height归一化到0-1之间
实现方法:
(1)将输入图像划分为
7
∗
7
7*7
7∗7的网格
(2)对于每个网格,我们都预测
2
2
2个边框(包括每个边框是目标的置信度、每个边框区域在多个类别上的概率)
(3)根据第上一步可以预测出
7
∗
7
∗
2
7*7*2
7∗7∗2个目标窗口,然后根据通过设置置信度阈值去除目标存在可能性较低的框,最后NMS(非极大值抑制)去除冗余框即可
网络架构:
损失函数:
- 一个网格单元预测多个bbox,希望的是每个bbox predictor专门负责预测某个object。具体做法就是看当前预测的bbox与ground truth box中哪个IoU大,就负责哪个。
NMS非极大值抑制:
- 对同一人脸有多个预测框,选择置信度最大的框
不足:
- YOLOv1对相互靠的很近的物体,检测效果不好,这是因为每个cell只有两个预测框,并且只属于一个类
- YOLOv1对很小的群体检测效果不好,这是因为一个网格中的预定框长宽比相对单一