因为最近在复习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. kvm-PLE代码分析

    Linux源码版本: 5.3.0 相关数据结构 #define KVM_DEFAULT_PLE_GAP 128 // ple_gap #define KVM_VMX_DEFAULT_PLE_WINDO ...

  2. Ping 的工作原理你懂了,那 ICMP 你懂不懂?

    计算机网络我也连载了很多篇了,大家可以在我的公众号「程序员cxuan」 或者我的 github 系统学习. 计算机网络第一篇,聊一聊网络基础 :计算机网络基础知识总结 计算机网络第二篇,聊一聊 TCP ...

  3. 死磕Spring之IoC篇 - 解析自定义标签(XML 文件)

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  4. 快速入门Redis调用Lua脚本及使用场景介绍

    Redis 是一种非常流行的内存数据库,常用于数据缓存与高频数据存储.大多数开发人员可能听说过redis可以运行 Lua 脚本,但是可能不知道redis在什么情况下需要使用到Lua脚本. 一.阅读本文 ...

  5. CCF(引水入城:60分):最大流+ISAP算法

    引水入城 201703-5 这从题目分析来看很像最大流的问题,只需要增加一个超级源点和一个超级汇点就可以按照题意连边再跑最大流算法. 因为数据量太大了,肯定会超时.但是没有想到可行的解决方法. #in ...

  6. 基于Hi3559AV100 RFCN实现细节解析-(3)系统输入VI分析(HiISP)二 :

    下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,整个过程涉及到VI.VDEC.VPSS.VGS.VO.NNIE,其中涉及的内容,大家可以参考之前我写的博客: 基于Hi3559AV10 ...

  7. AtCoder Beginner Contest 194

    A I Scream int main() { IOS; int a, b; cin >> a >> b; if(a + b >= 15 && b > ...

  8. Codeforces Round #684 (Div. 2)

    A 讨论三种情况,不换/全换成0/全换成1 ,取一个花费最小值 #include <bits/stdc++.h> using namespace std; const int N = 10 ...

  9. Java流程控制:增强for循环,break&continue,打印99乘法表

    增强for循环:java5引入了一种主要用于数组或集合的增强for循环for(声明语句:表达式){//代码句子} 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配.其作用域限定在循环语 ...

  10. idea配置struts2.5环境

    struts2不是struts1的下一代产品,是在struts1和WebWork技术的基础上进行合并后的全新框架,虽然两个名字相似,但是设计思想却有很大的不同. 使用本地的l ib 或者downloa ...