因为最近在复习yolo系列的算法,就借着这个机会总结一下自己对这个算法的理解,由于是第一次写算法类的博客,文中有什么错误和行文不通的地方还希望大家指正。

yolov2与yolov1有很多改变。

最重要的改动:引入了anchor机制。v1通过最后接一个全连接层直接输出bbox的坐标。在yolov2中参考了fast-rcnn中的先验框机制,通过卷积层来学习anchor的offsets避免了全连接层。为了试应anchor这一操作,作者在网络中移除了一个池化层,来获得更高的网络输出,并且为了得到奇数个grid cell,将网络的的输入分辨率从448转为416.yolo网络降采样32倍,所以最后输出是13x13. 在引入了anchor机制后,每一个anchor都生成类别与空间的预测,而不是yolov1中每一个grid cell生成一个Bx5+C的预测,这一点的引入加强了yolo对密集小目标的检测。在加入anchor后一张图从原来生成98个boxes改为生成上千个anchor boxes。这样做网络的Accuracy有所下降,但是recall召回率得到了显著的提升,因为目前在自动驾驶行业工作,联想到特斯拉之前在高速高速公路上把正样本识别成负样本所以在我看来自动驾驶中的目标检测召回率是要比准确率更重要的一个指标。

使用k-means聚类得出anchor。在距离时如果修正函数选择的还是欧氏距离的话,就会产生那个很经典的问题,大的目标框会比小目标框产生更大的error。所以为了使聚类时的distance不受框的大小影响,作者使用的一种新的距离计算方式:

这一操作有效的提高了最后结果的avg IOU,在自动驾驶的视觉方面,最后检测框的位置精度很大程度上会影响测距的精度。

对于 location predict输出内容的修改:对比RPN结构,RPN输出的是对anchor box的偏移量,这导致在模型训练初期会有很多bbox出现在图像的任意位置,这导致了训练初期模型的不稳定性,就是的训练需要更长的时间达到收敛。yolov2使用了对grid cell的偏移量来作为最后结果的输出,这使得与ground truth的差别落在了0和1直接,并在后面使用了sigmoid作为激活函数来限制输出。

最后网络输出5个值 tx ty tw th 和to,其中tx ty是之前介绍过的对于grid cell的偏移量,tw和th是对预测框的宽高和anchor的修正值。to是和yolov1一样是判定是否在grid cell中有物体并计算iou。最后输出预测框结果如下:

其中Cx和Cy是产生这个bbox的grid cell对于图像左上角的偏移量。pw和ph是anchor的宽和高。

使用了更细颗粒化的特征图:yolov2没有像ssd那样使用多尺度的特征图来产生anchor去使用不同大小的物体。而实使用了passthrough层来结合之前的26x26的特征图来讲最后的head部分特征图更finer-grained。

动态调整输入图片大小:由于yolov2的主干网络只使用了卷积层和池化层,这使得网络可以动态的调整特征图大小。为了使算法在不同分辨率上的图片表现的更好,在训练阶段,作者采用的了每10个batch就改变一下输入图像的尺度,因为网络的降采样是32倍,所以输入也都是32的倍数,从308到608.

backbone方面的改变:

YOLOV2中作者提出了自己的网络Darknet-19,而不是像v1中在googLEnet上做修改。正如绝大多数目标检测算法的backbone一样,darknet是一个分类网络,它把最后的全连接层换成了global average pooling层再接softmax层。整个网络只有卷积层和池化层,所以可以对输入灵活修改。下图为darknet的网络结构:

yolov2在每一个卷积层后都加入了BN层,在加入bn层后移除了训练中dropout的操作

yolov2在分类数据集ImageNet上预训练模型时直接使用了448x448分辨率的网络输入。在yolov1中预训练模型时输入的分辨率是224x224,在检测时才把分辨率转换成448x448

整个网络使用了19个卷积层和5个池化层。目前深度学习的网络设计思路就是加深加多参数,然后再去解决过拟合问题。

yolov2算法浅见的更多相关文章

  1. yolo2详解

    转自:https://blog.csdn.net/u014380165/article/details/77961414 YOLOV2要是YOLO的升级版(Better faster) Better ...

  2. AI佳作解读系列(二)——目标检测AI算法集杂谈:R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3

    1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...

  3. 检测算法简介及其原理——fast R-CNN,faster R-CNN,YOLO,SSD,YOLOv2,YOLOv3

    1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...

  4. Adaboost 算法的原理与推导

    0 引言 一直想写Adaboost来着,但迟迟未能动笔.其算法思想虽然简单“听取多人意见,最后综合决策”,但一般书上对其算法的流程描述实在是过于晦涩.昨日11月1日下午,邹博在我组织的机器学习班第8次 ...

  5. 目标检测网络之 YOLOv2

    YOLOv1基本思想 YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体. 每个格子预测B个bounding b ...

  6. 【深度学习】目标检测算法总结(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)

    目标检测是很多计算机视觉任务的基础,不论我们需要实现图像与文字的交互还是需要识别精细类别,它都提供了可靠的信息.本文对目标检测进行了整体回顾,第一部分从RCNN开始介绍基于候选区域的目标检测器,包括F ...

  7. yolo类检测算法解析——yolo v3

    每当听到有人问“如何入门计算机视觉”这个问题时,其实我内心是拒绝的,为什么呢?因为我们说的计算机视觉的发展史可谓很长了,它的分支很多,而且理论那是错综复杂交相辉映,就好像数学一样,如何学习数学?这问题 ...

  8. 目标检测算法之YOLOv1与v2

    YOLO:You Only Look Once(只需看一眼) 基于深度学习方法的一个特点就是实现端到端的检测,相对于其他目标检测与识别方法(如Fast R-CNN)将目标识别任务分成目标区域预测和类别 ...

  9. ubuntu yolov2 训练自己的数据集

    项目需求+锻炼自己,尝试用yolov2跑自己的数据集,中间遇到了很多问题,记下来防止忘记 一.数据集 首先发现由于物体特殊没有合适的现成的数据集使用,所以只好自己标注,为了减少工作量,先用opencv ...

随机推荐

  1. Nginx(八): 观进程锁的实现

    前面的nginx系列讲解了nginx很多通用概念,流程,以及核心的http模块的一些实现.应该说大体上对nginx已经不再陌生和神秘. 今天我们不看全局,只看一个非常非常小的细节:nginx是多进程并 ...

  2. 翻译:《实用的Python编程》03_01_Script

    目录 | 上一节 (2.7 对象模型) | 下一节 (3.2 深入函数) 3.1 脚本 在该部分,我们将深入研究编写 Python 脚本的惯例. 什么是脚本? 脚本就是运行和终止一系列语句的程序. # ...

  3. CF1491C Pekora and Trampoline 题解

    题目链接 ​ 比赛时只想到了 \(\mathcal O(n^3)\) 的暴力做法,官方题解是 \(\mathcal O(n^2)\) ,并且是可以优化为 \(\mathcal O(n)\) 的(贪心+ ...

  4. React 中的 onInput/onChange

    参考链接:https://stackoverflow.com/questions/38256332/in-react-whats-the-difference-between-onchange-and ...

  5. PAT-1153(Decode Registration Card of PAT)+unordered_map的使用+vector的使用+sort条件排序的使用

    Decode Registration Card of PAT PAT-1153 这里需要注意题目的规模,并不需要一开始就存储好所有的满足题意的信息 这里必须使用unordered_map否则会超时 ...

  6. WPF中Popup上的textbox无法切换到中文输入法

    As Marco Zhou has said in the msdn forum (http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b ...

  7. 关于,java-webservice接口,根据服务端,自动生成客户端调用时,响应时间慢

    我这边遇到的问题,是在和对方进行webservice接口交互的时候,用工具,调用对方的webservice接口,对方响应很快.但是用java生成的客户端调用就会很慢才得到响应.大概有5分钟左右. 这里 ...

  8. Python3中变量作用域nonlocal的总结

    最近,在工作中踩到了一个关于Python3中nonlocal语句指定的变量作用域的坑.今天趁周六休息总结记录一下. 众所周知,Python中最常见的作用域定义如下:   但是,为了更加方便地在闭包函数 ...

  9. Prometheus时序数据库-数据的查询

    Prometheus时序数据库-数据的查询 前言 在之前的博客里,笔者详细阐述了Prometheus数据的插入过程.但我们最常见的打交道的是数据的查询.Prometheus提供了强大的Promql来满 ...

  10. python创建一个二维列表

    方法一:利用for-in语句来生成一个二维列表 a = [] 2 for i in range(10): 3 a.append([]) 4 for j in range(10): 5 a[i].app ...