yolo v1发表在CVPR2016上,是经典的one-stage检测算法。在没接触yolo之前,我曾经就和师兄争论过,是否能把bounding box的坐标和宽高像分类网络那样预测出来,Yolo v1的出现证明了我的猜测是对的。


论文标题: 《You Only Look Once: Unified, Real-Time Object Detection》
论文地址:https://arxiv.org/pdf/1506.02640.pdf
推荐git: https://github.com/leviome/yolo_1_pytorch
这个repo是本人维护的,删掉了很多繁杂的部分,只保留最基本的yolo训练和预测结构。有利于快速上手,以及后期自定义添加插件。


v1是yolo系列的开山之作,以简洁的网络结构,简单的复现过程(作者给出详细教程)而受到CVer们的追捧。
yolo_v1奠定了yolo系列算法“分而治之”的基调,在yolo_v1上,输入图片被划分为7X7的网格,如下图所示:

如上图所示,输入图片被划分为7x7个单元格,每个单元格独立作检测。
在这里很容易被误导:每个网格单元的视野有限而且很可能只有局部特征,这样就很难理解yolo为何能检测比grid_cell大很多的物体。其实,yolo的做法并不是把每个单独的网格作为输入feed到模型,在inference的过程中,网格只是物体中心点位置的划分之用,并不是对图片进行切片,不会让网格脱离整体的关系。
可以通过yolo_v1的structure来进一步理解,相比faster r-cnn那种two-stage复杂的网络结构而言,yolo_v1的网络结构显得亲民得多。基本思想是这样:预测框的位置、大小和物体分类都通过CNN暴力predict出来。

上面是结构图yolo_v1结构图,通过结构图可以轻易知道前向传播的计算过程,是很便于读者理解的。v1的输出是一个7x7x30的张量,7x7表示把输入图片划分位7x7的网格,每一个小单元的另一个维度等于30。30=(25+20)。代表能预测2个框的5个参数(x,y,w,h,score)和20个种类
|SSSxSSSx(B∗5+C)(B*5+C)(B∗5+C) = 7x7x(2
5 + 20)|
|:|
|SxS表示网格数量,B表示每个网格生成框的个数,C表示能检测识别的种类。|
可以看出输出张量的深度影响yolo_v1能检测目标的种类。v1的输出深度只有30,意味着每个单元格只能预测两个框(而且只认识20类物体),这对于密集型目标检测和小物体检测都不能很好适用


训练

正如前面所说的,yolo是端到端训练,对于预测框的位置、size、种类、置信度(score)等信息的预测都通过一个损失函数来训练。
losslossloss === λcoord{\lambda}_{coord}λcoord​∑i=0S2\sum_{i=0}^{S^2}∑i=0S2​∑j=0B\sum_{j=0}^B∑j=0B​lijobjl_{ij}^{obj}lijobj​$[(x_i - \hat{x_i})2+(y_i-\hat{y_i})2] + $
λcoord{\lambda}_{coord}λcoord​∑i=0S2\sum_{i=0}^{S^2}∑i=0S2​∑j=0B\sum_{j=0}^B∑j=0B​lijobjl_{ij}^{obj}lijobj​$[(\sqrt{w_i}- \sqrt{\hat{w_i}})2+(\sqrt{h_i}-\sqrt{\hat{h_i}})2] + $
∑i=0S2\sum_{i=0}^{S^2}∑i=0S2​∑j=0B\sum_{j=0}^B∑j=0B​lijobjl_{ij}^{obj}lijobj​$(c_i - \hat{c_i})^2 + $
λnoobj{\lambda}_{noobj}λnoobj​∑i=0S2\sum_{i=0}^{S^2}∑i=0S2​∑j=0B\sum_{j=0}^B∑j=0B​lijnoobjl_{ij}^{noobj}lijnoobj​$(c_i - \hat{c_i})^2 + $
∑i=0S2\sum_{i=0}^{S^2}∑i=0S2​∑c∈classes\sum_{c\in classes}∑c∈classes​$(p_i©- \hat{p_i}©)^2 $

S2S^2S2表示网格数,在这里是7x7。BBB表示每个单元格预测框的个数,这里是2。
第一行就总方误差( sum-squared error)来当作位置预测的损失函数,第二行用根号总方误差来当作宽度和高度的损失函数。第三行和第四行对置信度confidence也用SSE作为损失函数。第五行用SSE作类别概率的损失函数。最后将几个损失函数加到一起,当作yolo v1的损失函数。
lijobjl_{ij}^{obj}lijobj​取值为0和1,即单元格内是否有目标。
λcoord{\lambda}_{coord}λcoord​ = 5
λnoobj{\lambda}_{noobj}λnoobj​ = 0.5
从上面公式也可以看得出来,yolo_v1就是选用最简单的SSE作为损失函数(PS:还没交叉熵复杂)。不过,能解决问题是王道。


总结

v1对于整个yolo系列的价值,即v2/v3还保留的特性,可以总结为3点:

  1. leaky ReLU,相比普通ReLU,leaky并不会让负数直接为0,而是乘以一个很小的系数(恒定),保留负数输出,但衰减负数输出;公式如下: y={x,x>00.1x,otherwisey =\begin{cases} x, x>0\\ 0.1x, otherwise \end{cases}y={x,x>00.1x,otherwise​
  2. 分而治之,用网格来划分图片区域,每块区域独立检测目标;
  3. 端到端训练。损失函数的反向传播可以贯穿整个网络,这也是one-stage检测算法的优势。

YOLO系列之yolo v1相关推荐

  1. yolo系列之yolo v3【深度解析】——讲的挺好,原作者厉害的

    版权申明:转载和引用图片,都必须经过书面同意.获得留言同意即可 本文使用图片多为本人所画,需要高清图片可以留言联系我,先点赞后取图 这篇博文比较推荐的yolo v3代码是qwe的keras版本,复现比 ...

  2. 通俗易懂的YOLO系列(从V1到V5)模型解读!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 0 前言 本文目的是用尽量浅显易懂的语言让零基础小白能够理解什么是 ...

  3. 【YOLO系列】YOLO V1 论文精读与学习总结

    目录 0. 前言 1.YOLO V1 大体思路 2. YOLO V1的训练过程 2.1 YOLO V1网络结构 2.2 具体训练过程 2.2.1 把主干结构在ImageNet上进行预训练 2.2.2 ...

  4. 你一定从未看过如此通俗易懂的YOLO系列(从V1到V5)模型解读!

    ↑ 点击蓝字 关注极市平台 作者丨科技猛兽@知乎 来源丨https://zhuanlan.zhihu.com/p/183261974(上) https://zhuanlan.zhihu.com/p/1 ...

  5. YOLO系列之yolo v2

    yolo_v2论文发表在CVPR2017.v2算法在v1的基础上可以说是飞跃性提升,吸取诸子百家之优势.同时,v2的论文也是目前为止yolo系列论文里干货最多的文章. 论文标题:<YOLO900 ...

  6. YOLO系列:YOLO v2深度解析 v1 vs v2

    概述 第一,在保持原有速度的优势之下,精度上得以提升.VOC 2007数据集测试,67FPS下mAP达到76.8%,40FPS下mAP达到78.6%,可以与Faster R-CNN和SSD一战 第二, ...

  7. YOLO系列:YOLO v1深度解析

    声明一点,我是工程应用人员,此文章仅适合算法应用工程师. 1.首先 先看一下YOLO的整体结构: 2.其次 看一下YOLO的工作过程: (1) 将原图划分为SxS的网格.如果一个目标的中心落入某个格子 ...

  8. YOLO系列:YOLO v3解析

    本文好多内容转载自 https://blog.csdn.net/leviopku/article/details/82660381 yolo_v3 提供替换backbone.要想性能牛叉,backbo ...

  9. YOLO系列代码解读(图像检测)

    1.YOLO v1 yolo v1源码解析 - 筱 - CSDN博客  https://blog.csdn.net/baidu_27643275/article/details/82794559 [D ...

最新文章

  1. redis常用命令参考
  2. python七段数码管设计图案-Python 七段数码管绘制
  3. 链栈的建立、判空、入栈、出栈、求长、访顶、清空和销毁
  4. php中退出怎么写,php中退出登录怎么写
  5. fiddler对手机进行抓包
  6. 【阿里妈妈营销科学系列】第二篇:消费者行为分析
  7. (一)卷积网络之基础要点
  8. 新手福利:百度官方中文教程,过年也要深度学习!
  9. Linux软中断、tasklet和工作队列
  10. 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。...
  11. PLSQL中的RECORD小例子
  12. ntpdate从指定服务器同步时间,ntpdate:设置服务器时间定期同步
  13. java实现单点登录
  14. Python内置TCP服务器
  15. php收藏影视,十个值得收藏的影视资源网站
  16. 寒霜朋克计算机丢失,寒霜朋克停止工作怎么办 寒霜朋克停止工作解决方法
  17. RTL8192EU调试信息
  18. 阿里内网最新发布“M8”级Java面试笔记,助力金九银十
  19. RAKsmart CN2 VPS主机性能评测
  20. Linux内存管理(一):综述

热门文章

  1. atrix 4g 安装linux,亲测ATRIX 4G MB860详细刷机教程二:解锁bootloader
  2. Cadence Virtuoso 原理图仿真报错问题解决
  3. centos7双机搭建_Centos7 Mysql 双机热备实现数据库高可用
  4. DirectShow使用大全
  5. 5-1链队入队出队操作
  6. 利用SPSS做数据分析②之数据处理2
  7. np.subtract.outer()
  8. 用matlab作乌鸦喝水,仿真程序动画作品--乌鸦喝水
  9. Docker容器——重命名镜像的TAG
  10. linux下HTK安装说明