YOLO v1总结
分类:
文章
•
2023-08-17 13:56:43
YOLO V1
1. idea
- 此前的目标检测将问题看成是分类问题,而yolo看成是一个回归问题
- yolo非常快,可以达到一秒45帧的速度
- yolo在运行时将整张照片作为输入,可以得到更多的context。而不像R-CNN那样将Bounding Box作为输入
- YOLO具有更强的泛化能力(得益于将图片整体作为输入?)
- yolo的运行步骤为:1. resize图片;2. 输入网络;3. 极大值抑制
2. details
- 将object detection的各个部分整合到一个单独的网络
- 将整张图片划分为S×S个网格grid,每个网格预测出B个bounding box,每个box各预测出一个置信度confidence(用于描述这个box包含object的概率),confidence的定义为
Pr(object)∗IOUpredtruth
假如没有object落在box中,则confidence为0
- 每个box要预测五个值,其中一个便是confidence,另外四个是(x,y,w,h),(x,y)表示box的中心。(x,y)是box相对于grid的的相对位置,归一化到[0,1],而(w,h)是相对于input(整张图)的比例,一样[0,1]
- 每个grid还需要预测出C(C为类别的总数)个概率值Pr(Classi∣Object)
- 在测试阶段,可以根据以下公式得到类别指定的置信度class-specific confidence
Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
- 因此,整个网络的输出是一个S×S×(B∗5+C)的tensor
3. Experiment
- CNN采用类似GoogleNet的结构
没有采用inception模块,采用1×1的卷积层降维加上一个3×3的卷积层代替
- 网络一共24层,fast yolo采用9层
- 数据集采用Pascal VOC,S=7,B=2,C=20,因此输出为7×7× 30的向量。
- 在ImageNet上进行预训练卷积层(预训练时长1周),在预训练的卷积层(20层)后加入4层卷积层和2层全连接层。因为目标识别需要更多的信息,将输入大小从224224增大到448448。
- loss采用sum-squared error。因为大部分的box都不包含object,不加权的情况下会使网络倾向于预测出confidence全0。同时,位置信息与分类错误权重一致的情况下实验不太理想。因此,增大位置信息(coordinate)的权重并增大那些包含object的box的权重,论文中加入两个参数λcoord=5,λnoobj=0.5。最终的loss function为
其中
- C为box的confidence,
-
pi(c)为第i个grid属于第c类的概率;
-
Iiobj代表object是否出现在第i个grid上(构建ground truth的时候每个object只在一个grid上有置信度,即object中心所在的grid才会使Iiobj=1)
-
Iijobj代表第i个grid中的第j个box是否responsible(首先筛选grid,选出object中心所在的grid,对这些grid中两个box选择具有最大iou的box,最后产生的box才是responsible。思想与进化算法相似,每个grid产生两个个体(grid),选择适应值(IOU)最高的grid)
-
Iijnoobj=1是除了4.中所指的其他所有的box
- 值得注意的是,对于分类error的惩罚只作用于出现object的grid上
- 对于宽和高h w的开根,是因为对于不同的大小box回归,预测偏差相等时对于小box的惩罚更大。如偏差同样为10,对于长为100的box的惩罚显然应该小于长为20的box
- 对于responsible的box的置信度error计算,target也就是ground truth需要在计算出预测值以后才能动态计算出相应的置信度,置信度为预测box与target box的IOU
- loss总结:对于responsible的box需要计算边框(x,y,w,h)的error以及置信度(目标置信度为与object的IOU)的error,对于其他box只需要计算置信度的error(目标置信度为0)。对于分类error,只需要计算object中心所在的grid。