YOLOv3算法笔记

本文为YOLOv3算法笔记,部分内容可能与SSD算法进行对比,如有错误或表达不当之处,欢迎指正。

1. YOLOv3的关键改进

  1. 新的网络结构:
    yolo3采用Darknet53作为检测的backbone,最关键的是引入了ResNet的残差块结构,有53层卷积的DarkNet因为identity避免梯度消失现象。
    关于网络结构可以参考博文

  2. 多尺度特征检测
    不同于v2版本的passthrough层来检测不同大小的目标,v3更进一步的结合FPN的思想实现检测不同大小的目标。我们知道在浅层网络容易获得目标的局部特征(如:边缘、棱角),深层网络容易获得目标的语义特征(如:car or cat)。yolo3在卷积层的第26、43和59层分别进行采样获取特征,在第59层直接卷积得到13x13x256的输出结果,而在第26层是通过与第52层特征图upsampling得到的特征图进行concat再卷积得到结果,第43层思想类似;
    有人讲这里的思想与SSD差不多,SSD分别在六个不同的特征层卷积得到结果;个人认为小改进有大学问,在浅层网络26与后面深层网络的上采样concat,这样一个简单的concat,却能让具有较多局部特征的浅层网络同时获得“未来”层的语义信息,对于分类将更加准确。

  3. prior box
    与v2类似,v3依然先用维度聚类获取最适用的prior box大小,作者在coco数据集上的结果是anchor=9,但是不同于SSD在所有层的每个grid cell都同时应用所有带下的anchor,v3对于9个不同大小的prior box,将他们分别应用在三个输出的特征层上,总体思想是,浅层特征图应用小的box,目的检测小目标,深层特征层应用大的box用来检测大目标。

  4. 目标对象分类由softmax改为logistics
    假设将特征图划分为SxS大小的格子(grid cell),则每个prior box输出 SxSx3(4+1+classes),其中:

     3:每个grid cell预测三个不同大小的prior box;
     4:预测的box的位置参数x, y, w, h;
     1:置信度参数
     classes:类别数
    

    其中需要强调一下
    位置参数x, y, w, h中,xy表示对坐标左上角的偏移,不同于SSD中是对cell中心的偏移,这里作者认为更可控,SSD中会出现偏移超过图片大小的情况;
    置信度参数是经过逻辑回归得到的,范围在0-1,有两层含义:对该box包含有目标的自信度和该目标是某一个类别的自信度(这个概率值可以理解为:网络认为预测出来的box大小与真实box大小的IOU值,但真实框在测试时是不存在的,所以称之为网络判定为某一个类别的自信度),也正是这个原因,classes就等于类别数,SSD中为类别数+1(+背景类)
    此外,在对classes进行分类的时候将softmax改为logistics可以满足目标的多层定义,比如可以区分(women 和 person)

2. 思考

  • 关于训练多少个prior box
    在SSD中通过两个原则选取与ground truth IOU值大的prior box,训练这些选择后的box进行回归与分类,而yolov3不一样:
    计算cell中不同尺度的box与gt的IOU,选择IOU值最大的那一个,当然IOU值有个阈值(表示最少要有多少重合,default = 0.5),如果有prior box的iou大于这个阈值但是不是iou值最大的那个box,那这个box将不会进行预测;如果一个prior box没有被分配有gt(iou值小于阈值),这个box也不会预测,同样只有objectness即置信度有值。
our system only assigns one bounding box prior for each ground truth object.

上面这句是原文的内容,即对于每一个gt,有且仅有一个prior box去预测它。

  • 关于yolov3正负样本
    在RCNN系列中,特别是从fast RCNN开始有ROI Pooling,通过ROI pooling选择正负样本,而在SSD算法中,将所有大于iou阈值的视为正样本,并且为了保证正负样本均衡,涉及了一个小ticks,进行hard negative mining,那在yoloV3中呢?
    理论上是这么做的:
    正样本:
    所有的prior box中与每一个gt计算IOU,对应值最大的那个就是正样本;
    负样本:
    所有的prior box中与每一个gt计算iou,对应值小于阈值(0.5)的全部当做负样本。
    还有一部分既不是正样本也不是负样本:iou值大于阈值0.5但又不是最大的那个,这部分不能简单的当做负样本,因此将他们丢弃,不参与计算。
    在这里插入图片描述
    然后只是理论上,实际操作中:
    貌似根本没有设置负样本,看有些代码将除开正样本的全部当做负样本
    此处不太理解,如果这么做,会出现比SSD更严重的正负样本不均衡问题,因为yolo3的正样本更少
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux创始人LinusTorvalds有一句名言:Talk is cheap, Show me the code.(冗谈不够,放码过来!)。 代码阅读是从入门到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。  YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。YOLOv3的实现Darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。  本课程将解析YOLOv3的实现原理和源码,具体内容包括: YOLO目标检测原理  神经网络及Darknet的C语言实现,尤其是反向传播的梯度求解和误差计算 代码阅读工具及方法 深度学习计算的利器:BLAS和GEMM GPU的CUDA编程方法及在Darknet的应用 YOLOv3的程序流程及各层的源码解析本课程将提供注释后的Darknet的源码程序文件。  除本课程《YOLOv3目标检测:原理与源码解析》外,本人推出了有关YOLOv3目标检测的系列课程,包括:   《YOLOv3目标检测实战:训练自己的数据集》  《YOLOv3目标检测实战:交通标志识别》  《YOLOv3目标检测:原理与源码解析》  《YOLOv3目标检测:网络模型改进方法》 建议先学习课程《YOLOv3目标检测实战:训练自己的数据集》或课程《YOLOv3目标检测实战:交通标志识别》,对YOLOv3的使用方法了解以后再学习本课程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值