YOLOv1、YOLOv2、YOLOv3概括总结

                                                         Yolov1

  1. 参考资料链接:https://www.jianshu.com/p/cad68ca85e27
  2. 将一幅图像分成S*S个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。
    个人理解:将图像分成S*S的网格,其实就是经过网络之后最终结果是一个S*S的矩阵,如果label中标定的物体中心在某个网格中,那么这个网格就负责预测这个物体信息(框的位置大小以及物体类别)。
  3. 输入的原始图像要求是缩放到448*448大小。因为在yolov1网络中卷积层最后接了两个全连接层,全连接层是要求固定大小的向量作为输入。
  4. 根据YOLOv1的设计,输入图像被划分为7*7的网格,输出张量中的7*7就对应着输入图像的7*7网格。或者我们把7*7*30的张量看做7*7=49个30维的向量,也就是输入图像中的每个网格对应输出一个30维的想想。
    要注意的是,并不是说仅仅网格内的信息被映射到一个30维向量。经过神经网络对输入图像信息的提取和变换,网格周边的信息也会被识别和整理。
  5. 每个网格要预测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了。
  6. 每个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是把类别概率预测值与边界框绑定在一起的
  7. yolov1中,输入图片最终被划分为7*7网格,每个单元格(grid cell)预测2个边界框(bounding box)。YOLOv1最后采用的是全连接层直接对边界框进行预测,其中边界框的宽和高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比的物体,yolov1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。
  8. 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的数量

  9. 对于某个ground truth匹配的预测框各部分loss值,包括坐标误差、置信度误差以及分类误差。先说一下匹配原则,对于某个ground truth,首先要确定其中心点要落在哪个cell上,然后计算这个cell的5个先验框与ground truth的IOU值,计算IOU值时不考虑坐标,只考虑形状,所以先将先验框与grund truth的中心点都偏移到同一位置(原点),然后计算出对应的IOU值,IOU值最大的那个先验框与ground truth匹配,对应的预测框用来预测这个ground truth

  10. YOLOv3采用了3个尺度的特征图(当输入为 416*416 时): [13*13] , [26*26] , [52*52] ,

 

                                                 Yolov2

  1. 参考链接:https://zhuanlan.zhihu.com/p/47575929
    1. 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后           (并 且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。     YOLOv1、YOLOv2、YOLOv3概括总结_第1张图片
       7、多尺度图像训练:因为去掉了全连接层,Yolov2可以输入任何尺寸的图像。因为整个网络下采样倍数是32,作者采用了{320,352,...,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,...19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测         
  2. 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。
  3. 对比YOLO1的输出张量,YOLO2的主要变化就是会输出5个先验框,且每个先验框都会尝试预测一个对象。输出的 13*13*5*25 张量中,25维向量包含 20个对象的分类概率+4个边框坐标+1个边框置信度。

                                                     Yolov3

YOLOv1、YOLOv2、YOLOv3概括总结_第2张图片

  1. Yolov3主要的改进有:调整了网络结构;利用多尺度特征进行对象检测;对象分类用logistic取代了softmax;
  2. yolov2采用的是darknet-19,yolov3采用的是darknet-53(借鉴了残差网络);
  3. YOLO2曾采用passthrough结构来检测细粒度特征,在YOLO3更进一步采用了3个不同尺度的特征图来进行对象检测。
  4. Yolov3使用了9种尺度的先验框(每个尺度的特征图对应三个尺度的先验框,一共三个尺度的特征图,3*3=9)。
  5. 预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样就能够支持多标签对象(比如一个人有woman和person两个标签);
  6. yolov3的输出结果特征图一共有三个尺度。分别为8*8、16*16、32*32,每个特征图的一个网格又负责预测三个box。所以
    8*8*3+16*16*3+32*32*3=4032个box(预测框)。
    4032个预测框分为三种情况:正例、负例、忽略样例。

  7. 正例:任取一个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.
  8. yolov1中每个cell负责中心落在该cell中的ground truth。而yolov3不同,它是根据预测值寻找IOU最大的预测框作为正例。原因是yolov3一共产生3个特征图,3个特征图上的cell,中心是有重合的。
  9. yolov3作者在文中没有提及优化器,Adam,SGD等都可以用,github上Yolov3项目中,大多使用Adam优化器
  10. 直接说结论:Yolov3精度与SSD相比略有小优,与Faster R-CNN相比略有逊色,几乎持平,比RetinaNet差。但是速度是SSD、RetinaNet、Faster R-CNN至少2倍以上。输入尺寸为320*320的Yolov3,单张图片处理仅需22ms,简化后的Yolov3 tiny可以更快。
  11. 三个特征图一共可以解码出 8 × 8 × 3 + 16 × 16 × 3 + 32 × 32 × 3 = 4032 个box以及相应的类别、置信度。这4032个box,在训练和推理时,使用方法不一样:训练时4032个box全部送入打标签函数,进行后一步的标签以及损失函数的计算。推理时,选取一个置信度阈值,过滤掉低阈值box,再经过nms(非极大值抑制),就可以输出整个网络的预测结果了。

  12. 使用sigmoid激活函数替代了Yolov2中的softmax,取消了类别之间的互斥,可以使网络更加灵活。

  13. 推理时,选取一个置信度阈值,过滤掉低阈值box,再经过nms(非极大值抑制),就可以输出整个网络的预测结果了。

NMS

就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。 
所谓非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A

(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是对所有的类别分别执行的

你可能感兴趣的:(YOLOv1、YOLOv2、YOLOv3概括总结)