06 You Only Look Once-V1学习笔记

9 篇文章 0 订阅
4 篇文章 0 订阅

参考文章:

  1. https://blog.csdn.net/woduoxiangfeiya/article/details/80866155(质量一般,还得对照原文看)
  2. https://zhuanlan.zhihu.com/p/58716896

代码以及训练自己的数据:

  1. 官方源代码:https://github.com/hizhangp/yolo_tensorflow,网络的配置参数在yolo/config.py下
  2. 设置数据集文件的嵌套格式如下,Annotations存放的是用labelImg标注好的xml文件,一张图片对应一个xml;JPEGImages下存放的是图片;ImageSets需要稍微再处理一下,在VOC2007路径中新建一个test.py, 并写入以下代码执行一下,执行后ImageSets/Main下会生成四个文件:trainval.txt、test.txt、train.txt、val.txt

    import os
    import random
    
    trainval_percent = 0.1
    train_percent = 0.9
    xmlfilepath = 'Annotations'
    txtsavepath = 'ImageSets\Main'
    total_xml = os.listdir(xmlfilepath)
    
    num = len(total_xml)
    list = range(num)
    tv = int(num * trainval_percent)
    tr = int(tv * train_percent)
    trainval = random.sample(list, tv)
    train = random.sample(trainval, tr)
    
    ftrainval = open('ImageSets/Main/trainval.txt', 'w')
    ftest = open('ImageSets/Main/test.txt', 'w')
    ftrain = open('ImageSets/Main/train.txt', 'w')
    fval = open('ImageSets/Main/val.txt', 'w')
    
    for i in list:
        name = total_xml[i][:-4] + '\n'
        if i in trainval:
            ftrainval.write(name)
            if i in train:
                ftest.write(name)
            else:
                fval.write(name)
        else:
            ftrain.write(name)
    
    ftrainval.close()
    ftrain.close()
    fval.close()
    ftest.close()
    
    # 参考的那篇文章给忘了,如有侵权,请在评论区留言并附上地址
    
  3. 训练自己的数据集,参考网址有:yolo_tensorflow_v1训练自己的数据集TensorFlow下使用YOLOv1训练+测试自己的数据集,具体要修改的内容有三处吧,第一处修改config.py文件CLASSES = ['class1', 'class2', 'class2'....] ;第二处pascal_voc.py文件中
     labels = np.zeros(
                (self.batch_size, self.cell_size, self.cell_size, 8)) #25修改为5+类别数

    第三处为(具体原因:每个框有四个位置信息和一个置信度,每一个网格只能预测出一个类别)

     label = np.zeros((self.cell_size, self.cell_size, 8)) #25修改为5+类别数

     

  4. 测试自己的模型:修改一下加载模型的路径和要测试的图片即可

(自己做的完整的代码,见github


论文笔记:

摘要:

提出了一种新的目标检测算法YOLO,在该论文中把目标检测看做了一个回归问题来预测空间分离的边界框和相关类别的概率;整个检测过程是一个单一过程,预测速度极快。(住:ground truth表示真实的标注框)

1、介绍

YOLO的输入为448*448,与R-CNN两阶段的模型相比,YOLO是单一网络,相比传统网络有以下优点:

  1.  速度很快,因为YOLO中把物体检测当做一个回归问题,可以达到45帧每秒,实现了实时监测;
  2. YOLO可以检测到整体的图像,不像fast-RCNN只检测到局部,所以YOLO的背景误差率相比fast-RCNN降低了一半;
  3. YOLO在自然物体(指实物)的图中进行学习,用在艺术图中的物体检测效果也很好;

缺点是:

  1. 每个网格只对应两个bounding box,当物体的长宽比不常见(训练未覆盖)时,效果较差;
  2. 原始图片只划分为7*7的网格,两个物体靠的很近时,效果很差;
  3. 最终每个网格只对应一个类别,容易出现漏检;
  4. 对于图片中较小的物体,效果比较差

2、Unified Detection(统一检测) 

将一张图划分为s*s个网格,如果一个物体的中心落在某个网格,则该网格负责检测该物体 ,每个网格预测B个边界框及每个框的confidence,conference反映了网格模型对该边界框是否有物体的信心,以及边界框位置预测的准确度,c=P_r(object) \cdot IOU^{truth}_{pred},其中P_r(object)=\left\{\begin{matrix} 1 & \\ 0 & \end{matrix}\right.,如果在该网格中没有物体,则置信度得分为0;否则置信度得分为IOU。每个边界框有五个预测值:x,y,w,h,confidence,其中(x,y)表示相对于网格单元边界的框的中心,(w,h)表示相对于整个图的宽和高。每个网格还会预测类别的条件概率P(classi|Object),每个网格只能给出一个类别概率,不管该网格有几个框。在测试时,将条件概率和confidence相乘从而得到每个边界框在各个类别的得分,这些得分表示某一类别出现在框中的概率以及预测框和真实框的拟合程度:P_r(classi|Object) \cdot confidence = P_r(classi) \cdot IOU^{truth}_{pred}

作者在PASCAL VOC数据集上评估YOLO时,令s=7, B=2, C=20,所以最终结果是7 \times 7 \times (2 \times 5 + 20)维。

 2.1 Network Design

  1. 用卷积层提取特征,用FC预测概率和坐标; 
  2. 在网络中,1 \times 1的卷积后加一个3 \times 3卷积,用1 \times 1的卷积来降低前一层的特征空间;
  3. 使用224 \times 224的输入在ImageNet上预训练模型,然后在检测时加倍
  4. 普通的YOLO有24个卷积层,而fast YOLO只有9个卷积层,其余一样,加上两个FC层,最后得到结果(普通的YOLO结构如下所示,注意:最后一层在代码中是以全连接层的形式即最后输出7 \times 7 \times 30 = 1470个结果,然后再reshape)

 2.2 training

  1. 在ImageNet上预训练,用的是前20层conv,一个avgpool,一个FC层。得到预训练模型后,在此基础上随机初始化4个卷积层和2个FC层,并将网络输入从224 \times 224 变到了448 \times 448;最后一层输出类别概率和边界框坐标,并且在最后一层中使用了leaky-relu\left\{\begin{matrix} x & x>0 \\ 0.1x & otherwise \end{matrix}\right.
  2. 损失函数如下两图所示(损失函数,有点费解,代码中更为费解)。在文中,\lambda _{coord}=5, \lambda _{noobj}=0.5,增加了包含物体的边界框预测的权重,并减少了不包含物体的边界框的置信度预测损失的权重。(注:loss函数只在网格中出现物体时才惩罚分类错误,如果这个预测器负责预测真实边界框(即所有网格的预测都有最高的IOU),他也仅惩罚预测坐标损失)【不懂?】
  3. 在PASCAL VOC 2007和2012上,训练了135个epochs,batch size=64, momentum=0.9, decay=0.0005
  4. 为了防止过拟合使用了dropout(rate=0.5)和数据增强的方法。通过dropout降低层之间的联合性,增强了泛化能力;数据增强:引入原始图像的20%的随即缩放和平移,在HSV色彩空间随机调整图像的曝光饱和达1.5倍

 2.3 前向传播

  1. 检测图时网络只需要执行一次,为每个图预测98个边界框,每个边界框一个置信度得分;
  2. 当一个大物体跨越多个网格,并被多个网格检测出时,用NMS解决(YOLO-v1的NMS策略, 对比SSD的正负样本匹配策略(还有SSD中的难负例例挖掘)以及faster rcnn中的RPN中正负样本的标注策略的差别)

NMS方法并不复杂,其核心思想是:选择得分最高的作为输出,与该输出重叠的去掉,不断重复这一过程直到所有备选处理完。YOLO的NMS计算方法如下:(参考网址:YOLO v1深入理解 9))

网络输出的7*7*30的张量,在每一个网格中,对象C_i位于第j个bounding box的得分:Score_{ij}=P(c_i|objeict) \times confidence_j它代表着某个对象C_i存在于第j个bounding box的可能性。

每个网格有:20个对象的概率*2个bounding box的置信度,共40个得分(候选对象)。49个网格共1960个得分。Andrew Ng建议每种对象分别进行NMS,那么每种对象有 1960/20=98 个得分。

NMS步骤如下:

1)设置一个Score的阈值,低于该阈值的候选对象排除掉(将该Score设为0)

2)遍历每一个对象类别

2.1)遍历该对象的98个得分

2.1.1)找到Score最大的那个对象及其bounding box,添加到输出列表

2.1.2)对每个Score不为0的候选对象,计算其与上面2.1.1输出对象的bounding box的IOU

2.1.3)根据预先设置的IOU阈值,所有高于该阈值(重叠度较高)的候选对象排除掉(将Score设为0)

2.1.4)如果所有bounding box要么在输出列表中,要么Score=0,则该对象类别的NMS完成,返回步骤2处理下一种对象

3)输出列表即为预测的对象

2.4 YOLO局限性

  1.  由于每个网格只预测两个框,且每个网格只能有一个类,所以很多小物体检测不出来;

3 与其他检测系统对比

YOLO是通用的检测器,可以检测多个物体。 

4 试验 YOLO的mAP达到了63.4%

6 结论

 以上就是学习的YOLO-v1的笔记,由于在做比赛,所以时间跨度有点久,感觉整体框架好理解,但是loss这一块还是不是特别清楚,欢迎大家积极讨论。以下附上手写笔记。


YOLO-V2:

YOLO-v2(参考网址),由于事情比较多,所以这里先补上之前做的yolo-v2笔记,如果日后有时间,会仔细补上yolo-v2的笔记。【原作地址:https://arxiv.org/pdf/1612.08242.pdf

参考网址:

  1. YOLO9000, Better, Faster, Stronger论文翻译——中英文对照
  2. 浅析YOLO, YOLO-v2和YOLO-v3

  3. YOLO9000, Better, Faster, Stronger论文翻译——中文版

 YOLO-v2(作者将主干网络称为Darknet-19)主要是精读了第二章better,并对比YOLO-V1所做的改进之处做了如下笔记:

yolo v3参考网址 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"YOLO:统一、实时的目标检测"简称YOLO,是一种深度学习算法,用于实时目标检测。它的核心思想是将目标检测问题转化为单个统一的回归问题,使得只需一次前向传播即可直接预测出目标的位置和类别。 相比于传统的目标检测方法,YOLO具有显著的优势。首先,YOLO采用了统一的网络结构,端到端地完成整个目标检测过程。这意味着不需要将图像分割成多个部分进行处理,减少了冗余计算,提高了计算效率。 其次,YOLO实时性能出色。它将目标检测任务与边界框回归深度学习模型相结合,使得可以在一次前向传播中同时预测出多个目标的位置和类别。因此,YOLO在速度上远远超过了传统的基于滑窗的目标检测方法。 此外,YOLO还采用了多尺度的特征图来检测不同大小的目标。通过在不同层级的特征图上进行预测,YOLO可以有效地捕捉目标的多尺度信息,并提高了目标检测的准确性。 然而,YOLO也存在一些局限性。由于采用了统一的网络结构,YOLO对小尺寸的目标检测相对较差。此外,当目标之间存在重叠或者遮挡时,YOLO可能会出现漏检或者虚警的情况。 总而言之,YOLO是一种统一、实时的目标检测算法,具有高效、准确的特点。它在图像处理、智能安防、自动驾驶等领域具有广泛的应用前景。然而,为了提升其性能,在处理小尺寸目标和目标重叠等复杂场景时,仍需要不断的研究和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值