今天开始分享一下YOLO系列的目标检测算法,前面介绍了SSD算法和Faster-RCNN,现在公司用Faster-RCNN的似乎不是很多,主要集中在YOLO,SSD以及CenterNet等。我们的检测和宇宙和分割宇宙刚刚开始,之后会更新一些这些算法的代码实战等,敬请期待吧。
回顾YOLO之前的目标检测算法,都是基于产生大量可能包含物体的先验框,然后用分类器判断每个先验框对应的边界框里是否包含待检测物体,以及物体所属类别的概率或者置信度,同时需要后处理修正边界框,最后基于一些准则过滤掉置信度不高和重叠度较高的边界框,进而得到检测结果。这种基于先产生候选区域再进行检测的方法虽然有较高的精度,但速度非常慢。YOLO直接将目标检测堪称一个回归问题进行处理,将候选区和检测两个阶段合二为一。YOLO的检测过程如下所示:
Fig1 事实上,YOLO并没有真正的去掉候选区,而是直接将输入图片划分成7x7=49个网格,每个网格预测两个边界框,一共预测49x2=98个边界框。可以近似理解为在输入图片上粗略的选取98个候选区,这98个候选区覆盖了图片的整个区域,进而用回归预测这98个候选框对应的边界框。
YOLO将输入图像划分为S*S的栅格,每个栅格负责检测中心落在该栅格中的物体。每一个栅格预测B个bounding boxes,以及这些bounding boxes的confidence scores。这个 confidence scores反映了模型对于这个栅格的预测:该栅格是否含有物体,以及这个box的坐标预测的有多准。公式定义如下: 如果这个栅格中不存在一个object,则confidence score应该为0。相反,confidence score则为预测框与真实框框之间的交并比。YOLO对每个bounding box有5个predictions:x, y, w, h,和 confidence。坐标x,y代表了预测的bounding box的中心与栅格边界的相对值。坐标w,h代表了预测的bounding box的width、height相对于整幅图像width,height的比例。confidence就是预测的bounding box和ground truth box的IOU值。每一个栅格还要预测C个conditional class probability(条件类别概率):Pr(Classi|Object)。即在一个栅格包含一个Object的前提下,它属于某个类的概率。我们只为每个栅格预测一组(C个)类概率,而不考虑框B的数量。如Fig2所示:
Fig2 YOLO将检测模型化为回归问题。它将图像划分为S×S网格,并且每个网格单元预测B个边界框,对这些框的置信度以及C类概率。这些预测值被编码为S×S×(B * 5 + C)张量。为了评估PASCAL VOC上的YOLO,我们使用S = 7,B = 2。PASCAL VOC有20个标记类,因此C = 20。我们的最终预测是7×7×30张量。
我们将此模型作为卷积神经网络实施并在PASCAL VOC检测数据集上进行评估。网络的初始卷积层从图像中提取特征,而全连接的层预测输出概率和坐标。YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。完整的网络结构如Fig3所示,最终的输出结果是一个7730的张量。
首先利用ImageNet 1000-class的分类任务数据集Pretrain卷积层。使用上述网络中的前20 个卷积层,加上一个 average-pooling layer,最后加一个全连接层,作为 Pretrain 的网络。训练大约一周的时间,使得在ImageNet 2012的验证数据集Top-5的精度达到 88%,这个结果跟 GoogleNet 的效果相当。
将Pretrain的结果的前20层卷积层应用到Detection中,并加入剩下的4个卷积层及2个全连接。同时为了获取更精细化的结果,将输入图像的分辨率由 224* 224 提升到 448* 448。将所有的预测结果都归一化到 0~1, 使用 Leaky RELU 作为激活函数。Leaky RELU的公式如下:
Leaky RELU可以解决RELU的梯度消失问题。
损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。简单的全部采用了sum-squared error loss来做这件事会有以下不足:a) 8维的localization error和20维的classification error同等重要显然是不合理的。b) 如果一些栅格中没有object(一幅图中这种栅格很多),那么就会将这些栅格中的bounding box的confidence 置为0,相比于较少的有object的栅格,这些不包含物体的栅格对梯度更新的贡献会远大于包含物体的栅格对梯度更新的贡献,这会导致网络不稳定甚至发散。为了解决这些问题,YOLO的损失函数的定义如下:
网上找到一张详细的损失函数解释图:
YOLO的损失函数更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 λcoord ,在pascal VOC训练中取5。(上图蓝色框) 对没有object的bbox的confidence loss,赋予小的loss weight,记为 λnoobj ,在pascal VOC训练中取0.5。(上图橙色框) 有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏相同的尺寸对IOU的影响更大。而sum-square error loss中对同样的偏移loss是一样。为了缓和这个问题,作者用了一个巧妙的办法,就是将box的width和height取平方根代替原本的height和width。如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。
在 YOLO中,每个栅格预测多个bounding box,但在网络模型的训练中,希望每一个物体最后由一个bounding box predictor来负责预测。因此,当前哪一个predictor预测的bounding box与ground truth box的IOU最大,这个 predictor就负责 predict object。这会使得每个predictor可以专门的负责特定的物体检测。随着训练的进行,每一个 predictor对特定的物体尺寸、长宽比的物体的类别的预测会越来越好。
测试的时候,每个网格预测的class信息和bounding box预测的confidence信息 相乘,就得到每个bounding box的class-specific confidence score。
在这里插入图片描述
- 对每一个网格的每一个bbox执行同样操作:7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)
- 得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
NMS的过程如下:
Table1给出了YOLO与其他物体检测方法,在检测速度和准确性方面的比较结果(使用VOC 2007数据集)。
论文中,作者还给出了YOLO与Fast RCNN在各方面的识别误差比例,如Table4所示。YOLO对背景内容的误判率(4.75%)比Fast RCNN的误判率(13.6%)低很多。但是YOLO的定位准确率较差,占总误差比例的19.0%,而Fast RCNN仅为8.6%。
在这里插入图片描述
https://zhuanlan.zhihu.com/p/25236464 https://www.bilibili.com/video/av23354360?from=search&seid=14097781066157427376
本文分享自 GiantPandaCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!