Yolov1
- 参考资料链接:https://www.jianshu.com/p/cad68ca85e27
- 将一幅图像分成S*S个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。
个人理解:将图像分成S*S的网格,其实就是经过网络之后最终结果是一个S*S的矩阵,如果label中标定的物体中心在某个网格中,那么这个网格就负责预测这个物体信息(框的位置大小以及物体类别)。 - 输入的原始图像要求是缩放到448*448大小。因为在yolov1网络中卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入。
- 根据YOLOv1的设计,输入图像被划分为7*7的网格,输出张量中的7*7就对应着输入图像的7*7网格。或者我们把7*7*30的张量看做7*7=49个30维的向量,也就是输入图像中的每个网格对应输出一个30维的想想。
要注意的是,并不是说仅仅网格内的信息被映射到一个30维向量。经过神经网络对输入图像信息的提取和变换,网格周边的信息也会被识别和整理。 - 每个网格要预测B个bounding box(边界框)(疑问:每个bounding box的尺寸是固定的还是不固定的),每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值(置信度)。这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息。
其值是这样计算的:如果有object落在一个gridcell里,第一项取1,否则取0.
IOU体现了预测的bounding box与真实的bounding box的接近程度。在训练阶段,这里的iou是真实计算出来的,等到测试阶段(inference),因为没有真实的框(ground truth),只能完全依赖于网络的输出,这是已经不需要(也无法)计算IOU了。 - 每个bounding box要预测(x,y,w,h)和confidence共5个值,每个网格还要预测一个类别信息,设一共有C个类别。则S*S个网格,每个网格要预测B个bounding box,还要预测C个类别。输出就是S*S*(5*B+C)的一个tensor。
注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的(每个网格对应一个30维的数据,有10维是两个bounding box的数据,有20维是20类物体的类别概率,所以说不管一个网格预测多少个边界框,其值预测一组类别概率值,也就是说这一个网格预测的多个bounding box都是同一类,这是yolo算法的一个缺点,在后来的改进版本中,yolo9000是把类别概率预测值与边界框绑定在一起的)。 - yolov1中,输入图片最终被划分为7*7网格,每个单元格(grid cell)预测2个边界框(bounding box)。YOLOv1最后采用的是全连接层直接对边界框进行预测,其中边界框的宽和高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比的物体,yolov1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。
-
mAP定义及相关概念
mAP: mean Average Precision, 即各类别AP的平均值
AP: PR曲线下面积,后文会详细讲解
PR曲线: Precision-Recall曲线
Precision: TP / (TP + FP)
Recall: TP / (TP + FN)
TP: IoU>0.5的检测框数量(同一Ground Truth只计算一次)
FP: IoU<=0.5的检测框,或者是检测到同一个GT的多余检测框的数量
FN: 没有检测到的GT的数量 -
对于某个ground truth匹配的预测框各部分loss值,包括坐标误差、置信度误差以及分类误差。先说一下匹配原则,对于某个ground truth,首先要确定其中心点要落在哪个cell上,然后计算这个cell的5个先验框与ground truth的IOU值,计算IOU值时不考虑坐标,只考虑形状,所以先将先验框与grund truth的中心点都偏移到同一位置(原点),然后计算出对应的IOU值,IOU值最大的那个先验框与ground truth匹配,对应的预测框用来预测这个ground truth
- YOLOv3采用了3个尺度的特征图(当输入为 416*416 时): [13*13] , [26*26] , [52*52] ,
Yolov2
- 参考链接:https://zhuanlan.zhihu.com/p/47575929
- Yolov2较Yolov1进行的改进:
1、batch normalization(批归一化):https://zhuanlan.zhihu.com/p/34879333
2、使用更高分辨率图像微调分类模型:
图像分类的训练样本很多,而标注了边框的用于训练目标检测的样本相对较少(因为标注的人工成本较高)。所以目标 检测模型通常都先用图像分类样本训练卷积层,但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以 YOLO v1使用ImageNet的图像分类样本采用 224*224 作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用 的图像样本采用更高分辨率的 448*448 的图像作为输入。但这样切换对模型性能有一定影响。所以YOLO2在采用 224*224 图像进行分类模型预训练后,再采用 448*448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特 征逐渐适应448*448 的分辨率。然后再使用 448*448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。
3、采用先验框(anchor box);
4、聚类提取先验框尺度;
5、约束预测边界;
6、passthrough层检测细粒度特征;
就是在最后一个pooling之前,特征图的大小是26*26*512,将其1拆4,直接传递(passthrough)到pooling后 (并 且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。
7、多尺度图像训练:因为去掉了全连接层,Yolov2可以输入任何尺寸的图像。因为整个网络下采样倍数是32,作者采用了{320,352,...,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,...19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测
- Yolov2较Yolov1进行的改进:
- YOLO2的训练主要包括三个阶段。
第一阶段就是先在ImageNet分类数据集上预训练Darknet-19,此时模型输入为 224*224 ,共训练160个epochs。
然后第二阶段将网络的输入调整为 448*448 ,继续在ImageNet数据集上finetune分类模型,训练10个epochs,此时分类模型的top-1准确度为76.5%,而top-5准确度为93.3%。
第三个阶段就是修改Darknet-19分类模型为检测模型,移除最后一个卷积层、global avgpooling层以及softmax层,并且新增了三个 3*3*1024卷积层,同时增加了一个passthrough层,最后使用 1*1 卷积层输出预测结果,输出的channels数为:num_anchors*(5+num_classes) ,和训练采用的数据集有关系。由于anchors数为5,对于VOC数据集(20种分类对象)输出的channels数就是125。 - 对比YOLO1的输出张量,YOLO2的主要变化就是会输出5个先验框,且每个先验框都会尝试预测一个对象。输出的 13*13*5*25 张量中,25维向量包含 20个对象的分类概率+4个边框坐标+1个边框置信度。
Yolov3
- Yolov3主要的改进有:调整了网络结构;利用多尺度特征进行对象检测;对象分类用logistic取代了softmax;
- yolov2采用的是darknet-19,yolov3采用的是darknet-53(借鉴了残差网络);
- YOLO2曾采用passthrough结构来检测细粒度特征,在YOLO3更进一步采用了3个不同尺度的特征图来进行对象检测。
- Yolov3使用了9种尺度的先验框(每个尺度的特征图对应三个尺度的先验框,一共三个尺度的特征图,3*3=9)。
- 预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样就能够支持多标签对象(比如一个人有woman和person两个标签);
- yolov3的输出结果特征图一共有三个尺度。分别为8*8、16*16、32*32,每个特征图的一个网格又负责预测三个box。所以
8*8*3+16*16*3+32*32*3=4032个box(预测框)。
4032个预测框分为三种情况:正例、负例、忽略样例。
正例:任取一个ground truth,与4032个预测框全部计算IOU,IOU最大的预测框,即为正例。并且一个预测框只能分配给一个ground truth。例如第一个ground truth已经匹配了一个正例检测框,那么下一个ground truth就在余下的4031个检测框中,寻找IOU最大的检测框作为正例(ground truth的先后顺序可忽略)。正例产生置信度loss、检测框loss、类别loss。预测框为对应的ground truth box标签(需要反向编码,使用真实的x、y、w、h计算出 );类别标签对应类别为1,其余为0;置信度标签值为预测框与ground truth的iou,训练时置信度的损失值使用mse。
忽略样例:正例除外,与任意一个ground truth的IOU大于阈值(论文中使用0.5),则为忽略样例。忽略样例不产生任何loss。
负例:正例除外(与ground truth计算后IOU最大的检测框,但是IOU小于阈值,仍为正例),与全部ground truth的IOU都小于阈值(0.5),则为负例。负例只有置信度产生loss,置信度标签为0.- yolov1中每个cell负责中心落在该cell中的ground truth。而yolov3不同,它是根据预测值寻找IOU最大的预测框作为正例。原因是yolov3一共产生3个特征图,3个特征图上的cell,中心是有重合的。
- yolov3作者在文中没有提及优化器,Adam,SGD等都可以用,github上Yolov3项目中,大多使用Adam优化器
- 直接说结论:Yolov3精度与SSD相比略有小优,与Faster R-CNN相比略有逊色,几乎持平,比RetinaNet差。但是速度是SSD、RetinaNet、Faster R-CNN至少2倍以上。输入尺寸为320*320的Yolov3,单张图片处理仅需22ms,简化后的Yolov3 tiny可以更快。
-
三个特征图一共可以解码出 8 × 8 × 3 + 16 × 16 × 3 + 32 × 32 × 3 = 4032 个box以及相应的类别、置信度。这4032个box,在训练和推理时,使用方法不一样:训练时4032个box全部送入打标签函数,进行后一步的标签以及损失函数的计算。推理时,选取一个置信度阈值,过滤掉低阈值box,再经过nms(非极大值抑制),就可以输出整个网络的预测结果了。
-
使用sigmoid激活函数替代了Yolov2中的softmax,取消了类别之间的互斥,可以使网络更加灵活。
-
推理时,选取一个置信度阈值,过滤掉低阈值box,再经过nms(非极大值抑制),就可以输出整个网络的预测结果了。
NMS
就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。
所谓非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A<B<C<D<E<F。
(1) 从最大概率矩形框F开始,分别判断A、B、C、D、E与F的重叠度IOU是否大于某个设定的阈值;
(2) 假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3) 从剩下的矩形框A、C、E中,选择概率最大的E,然后判断A、C与E的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
(4) 重复这个过程,找到所有被保留下来的矩形框。
YOLO中的NMS
1、参考资料:https://blog.csdn.net/m0_37605642/article/details/98358864
2、NMS是对所有的类别分别执行的