You Only Look Once : Unified, Real-Time Object Detection
前言:这个呢是看了b站同济子豪兄的视频进行的记录,因为能力有限,所以就想着用记录视频作者解释的话来慢慢理解yolo,所以这里的文字内容,大部分都是作者的原话。所以该文章主要是给自己看的。
*作者:Joseph Redmon ,Santosh Divvala ,Ross Girshick ,AliFarhadi
**机构:*University of Washington ,Allen Institute for AI , Facebook AI Research
名词解析
DPM算法:滑动窗口分类器
R-CNN算法:
- 第一阶段:提取潜在的候选框(Region Proposa)
- 第二阶段:用分类器逐一筛选每一个候选框
NMS:Non-max suppresion 非极大值抑制,用于过滤重复的预测框
AP:average precision 平均查准率(详细看西瓜书)
IOU:Intersection over Union 是一种测量在特定数据集中检测相应物体准确度的一个标准
confident:置信度
1 i j o b j 1^{obj}_{ij} 1ijobj :指示函数(indicator function)含义是:当输入为True的时候,输出为1,输入为False的时候,输出为0。
dropout:在训练过程中每一步都随机掐死一半的全连接层的神经元,使得它的输出和反向传播回来的都为0(打破神经元联合依赖适应性)
数据增强:可以扩充数据集,可以防止过拟合可以让模型适应各种各样的变化,提高鲁棒性
视频解读摘抄:同济子豪兄-yolov1
https://www.bilibili.com/video/BV15w411Z7LG?p=11&share_source=copy_web
摘要:
从分类问题转化为回归问题,使用单独的神经网络,既可以预测预测框的坐标,也可以预测类别。可以进行端到端的优化(这是神经网络的优点),一次性解决所有问题,而不需要像多阶段问题解决,一个环节出错,就不能够使用。
识别速度快,出现更多的定位误差,但是把背景误判为目标的问题,比较小。同时yolo泛化迁移能力比较强,各行各业都能使用yolo。
1. Introduciton:
以前的目标检测器都是重复使用分类器。比如DPM算法,滑动窗口分类器。
另一种方法是R-CNN,先提取出2~3000个候选框,然后再逐一的进行分类和回归,这里就可能用到一些算法进行后处理,比如用非极大抑制NMS来消除重复的预测框,然后再微调每一个预测框,根据图像上其他物体,重新给每一个预测框打分(这里是非常繁琐的,依赖庞大的供应链,一个问题出错,就不能使用了)。
而yolo重新定义回归问题。从输入图像,直接获得每一个定位信息还有就是预测结果,目标和类别。下图就是yolo的预测阶段的演示图
优点:
- 速度快,可以达到每秒45帧的速度(Titan X显卡),最快的可以达到150fps。可以达到实时检测,同时相对于其他实时检测模型,准确模型是他们的两倍。
- 能够捕获全图的信息,上下文信息。把背景无当做目标的错误是很少的。
- 泛化能力,迁移能力比较强。是要比DPM,R-CNN模型的泛化能力高得多。用于新领域,它的性能下降的是比较少的。迁移能力是比较好的。
缺点:
- 在定位能力和小目标的识别能力是比较差的。(后面论文可以看出来)
2.Unified Detection
统一的目标检测框架
该神经网络能够捕获全图的信息,预测每一个预测框的坐标和分类。这意味着网络能够挖掘全图的信息。同时能够一步到位的识别出所有物体,让实时预测称为可能,同时保持一个高的AP(Average Precision)
在这个系统,我们将图片划分为S x S 个 grid cell(网格单元) ,该论文用的是7*7的网格。
每个grid cell 预测 B 个bounding boxes(包围盒) ,该论文用的是2个bounding boxes。在训练阶段,哪一个bounding box与人工标注的IOU(交并比)最大,就由哪一个bounding boxes去负责预测这个物体。训练阶段是一个监督学习,来使得损失函数最小化的过程。下图是置信度的计算公式( P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object)*IOU^{truth}_{pred} Pr(Object)∗IOUpredtruth),用于损失函数。
包含该物体的概率(非0即1) * 人工标注框的交并比(包含物体*离这个物体有多近)
在预测阶段:回归出多少就是多少,不需要直接计算Pr(Object)和IOU,而是隐式的包含两者。
每一个bounding box都包含5个参数,x,y,w,h,和confidence(x,y:中心点的横纵坐标 w,h:bounding box的宽高),每一个bounding box 的中心点,都应该落在grid cell里面,不能超出。无论bounding box多大。 所以(x,y)是相对于grid cell 坐标,是在01之间的。(w,h)是相对于整幅图片的,所以也在01之间,confidence,也是在0~1之间的。这样都归一化了,比较好处理。confidence是预测框和实际框之间的IOU。
每一个grid cell 还需要预测C个conditional class probablities(条件类别概率)$ Pr(Class_i|Object)$(在当前bounding box 已经包含物体的条件下,各类别的概率)。给个grid cell 只预测一组条件类别概率,它对应的B个bounding box共享这个条件类别概率
测试阶段 将每个bounding box 的confidence score 与所在grid cell的条件类别概率相乘。 等号右边即表明了分类的精度,又表明了IOU的精度
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^{truth}_{pred}=Pr(Class_i)*IOU^{truth}_{pred} Pr(Classi∣Object)∗Pr(Object)∗IOUpredtruth=Pr(Classi)∗IOUpredtruth
预测阶段:
- 将输入图片划分为s*s个grid cell
- 每个grid cell 预测出两个bounding box(可以大小各异,只要中心点在这个grid cell里面)
- 每一个grid cell 都产生4个参数 和一个confidence参数,confidence 就用线的粗细来表示,位置参数就用框来表示
- 每一个gird cell 预测一组条件类别概率
- 把上下两张图整合到一起,把低置信度框过滤掉,把重复的预测框用非极大值抑制剃掉,然后再加上类别就产生了最后图片的结果
- 我们就知道了图像上,每个框的位置和图像类别
训练阶段:
- 人工标注的Ground Truth框中心点落在哪一个grid cell中就应由哪个grid cell预测这个物体
- 每个grid cell 预测B个bounding boxes
- 与Ground Truth 框IOU最大的bounding boxes负责预测这个物体
- 每个grid cell只能检测一个物体
- 所以所有的bounding box被分成了三类
- 负责预测物体的bounding box
- 在预测的grid cell里面,但是不负责预测物体的bounding box——这是被挤占掉的bounding box
- 不负责预测物体的grid cell 里边的bounding box
改论文用的是PASCAL VOC数据集上,S=7 B=2 ,有20个标签分类C=20.最后张量的维度是7 * 7 * 30(张量:7 * 7的矩阵,构成了一张纸,把30张纸堆起来,形成了一本书,这本书就形成了该数据结构)
2.1Network Design 网络设计
使用卷积神经网络来实现在PASCAL VOC目标检测数据集上进行评估,最开始的卷积层负责提取特征。后面的全连接层负责预测出这些数值。和图像分类类似(图像分类示全连接层预测每一个类别的概率,而这里的全连接层负责预测这个图片的张量)
该神经网络是受到了GoogLeNet 模型的启发。包含了24个卷积层,最后有两个全连接层。GoodLeNet使用的是inception modules。但我们这儿没有使用这个,而是使用了1 * 1卷积(1 * 1卷积是启发与network in network 这篇文章)(1 * 1卷积有很多作用,比如降维,升维,跨通道信息交流,减少权重,都是由1 * 1卷积实现的)跟上3 * 3卷积。
我们也训练了更快的yolo版本,Fast YOLO,将快速达到极致,使用更少的卷积层(9个),使用了更少的卷积核。但是其他的网络参数都是和基准的yolo是一样的。
Figure 3:The Architecture:该检测神经网络含有24个卷积层跟着2个全连接层。交替使用1 * 1卷积层和3 * 3卷积,11卷积的目的是降维,减少feature map的个数,也就是减少了权重个数和计算量。整个网络先是用ImageNet 图像分类这个数据集去训练。使用的是224 * 224的输入图片的分辨率。然后再在448448分辨率上训练检测的模型。
**看一下这个图:**输入448 * 448 * 3通道。先用64个7 * 7的卷积核,以步长为2进行卷积来最大池化(2 * 2)