图片来源于b站up主:同济子豪兄,大部分整理也来源于他讲的YOLOv1视频

特点及优势

1、将分类问题转化为回归问题, 预测出一系列连续的数值,将边界框和相关的分类可能性从空间上分离开了

2、利用单一的神经网络实现端到端的检测,无需复杂的工作流,实时性好

3、又快又好,不太可能可能出现将背景误判为目标,因为它是一次性装入全图,隐式学习全图的信息

4、泛化迁移能力强,在自然物体上训练的模型在艺术作品上进行预测效果依然比其他模型好。普适性强,可以应用于多个领域

缺点

1、相比当年最强的几个模型在准确率上还有些落后

2、定位能力和识别小目标的能力比较差(每个grid cell只能识别一个物体)

3、由于我们的模型从数据中学习如何预测边界框,因此它遇到新的数据或数据不寻常的高宽比或配置时将较难适应

以往目标检测

1、DPM的分类器平均在图像上滑动,将每次滑动的结果汇总综合出最后的目标检测结果--耗时繁琐

2、RCNN使用选择性搜索方法从图像中先提取上千个候选框,再用神经网路对其逐一的分类和回归,最后进行后处理,每一个步骤都需要单独的训练,一旦一个环节出错,会影响整个网络

网络设计

模型以卷积神经网络来实现,在PASCAL VOC数据集上评估。网络的初始卷积层用来提取图像特征,全连接层用来预测类别概率和坐标。网络结构受到图像分类网络GoogLeNet的启发,包括24层卷积层和2层全连接层,不同于GoogLeNet使用的Inception块,使用一个1×1卷积层后面跟一个3×3卷积层,交替使用的1×1卷积层降低前一层的特征空间。使用一半(224×224输入图像)的输入在ImageNet图像分类任务中预训练卷积层,然后在检测时将输入加倍。


  为了加快检测速度还训练了一个快速的YOLO版本。Fast YOLO 使用较少的卷积层,9层而不是普通版的24层,和更小的卷积核。除了网络较小,Fast YOLO和YOLO训练和测试参数是一样的。网络最终输出是7 × 7 × 30的预测张量 。

训练阶段(监督学习使损失函数最小化的过程)

1、   将输入图片划分为S*S个网格grid cell,人工标记的标签Ground Truth框中心点落在哪个grid cell中,就在哪个grid cell中预测该物体(即由该grid cell负责拟合Ground Truth框),每个grid cell预测B个bounding boxs,与Ground Truth框IoU最大的bounding box负责预测这个物体,每个grid cell只能检测一个物体。

每个grid cell预测B个bounding box,每个bounding box包含5个参数x,y,w,h and confidence:中心点的横纵坐标,框的宽度和高度、置信度。(x,y)是bounding box中心点相对于所在grid cell左上角格点的坐标,(w,h)是相对于整幅图片的宽高,故值都在0~1之间,起到了均一化的效果。confidence预测值表示预测框和任意Ground Truth box的交并比IOU,反映了候选框是否包含物体及离Ground Truth有多近(即预测候选框有多准确),用数学公式表示为confidence=

在训练阶段Pr标签值非0即1,IoU按实际计算,两者乘积即为confidence score的标签值,对于负责预测物体的box,这个标签值其实就是IoU。

除此之外,每个grid cell还预测C个类别条件概率Pr(Classi | Object),即在当前bounding box已经包含物体的条件下各类别的概率。每个grid cell只预测一组条件类别概率,它所对应的B个bounding box共享这个条件概率,在测试阶段将每个bounding box的confidence score与所在的grid  cell的条件类别概率相乘得到每一个box的各类别的置信度得分

结果既表明了分类的精度也表明了定位的精度。

通过Class probability map可以知道每个网格只能有一个类别,是从其预测的一组条件类别概率中选出的最高的一个,进而说明每个网格只能预测出一个物体,故只能预测S*S个物体,这也是YOLOV1对小目标和密集目标识别性能差的原因

在PASCAL VOC数据集上训练,故类别C=20,且S=7,B=2,所以最后预测结果是一个7*7*30的张量。在ImageNet 1000类数据集上预训练我们的卷积层。预训练时我们使用图3中的前20个卷积层后面再加上一个平均池化层、一个全连接层。然后我们转化网络执行检测。Ren等人提出在预训练模型中加入卷积层和全连接层可以提高性能,根据他们的想法,我们添加了随机初始化参数的4个卷积层和2个全连接层。检测任务需要细粒度的视觉信息,所以我们将网络输入的分辨率从224×224增加到448×448。

2、我们对最后一层使用线性激活函数,其他层使用激活函数leaky ReLu。

3、损失函数:我们使用平方和误差来优化模型。使用平方和误差较容易优化(容易求导),但是不能完全符合我们最大化平均精度的目标。它将定位误差和分类误差同等对待是不太合理的。
  为了弥补这一点,我们增加了边界框坐标预测损失的权重,并减少了不包含物体的边界框的置信度预测损失的权重。我们使用两个参数λcoord和λnoobj来完成这个。我们设置λcoord = 5和λnoobj =0 .5。
  平方和误差计算损失时将大框和小框同等对待,同样的一个损失值对大框的影响大于对小框的影响。为了解决这个问题,我们计算损失时先对框的宽度和高度求根号再计算平方和。
  YOLO为每个网格预测多个边界框。在训练时我们希望每个物体只有一个边界框负责检测这个物体。我们选择和真实物体位置IOU最大的边界框作为负责检测这个物体的边界框。这使得我们的边界框预测变量都负责预测特定物体。所以每个预测变量可以更好地预测边界框尺寸,纵横比或物体类别,(B个框逐渐特化,每个框都聚焦特定形状或长宽比)从而改善整体召回率(真正的物体被检测出来的比例)。
  训练期间我们优化下图中的损失函数:

4、 训练中我们的batch size为64,momentum为0.9,decay为0.0005(权重衰减L2正则化)。
  我们的learning rate(学习率)计划如下:在第一个epoch中我们将learning rate慢慢的从0.001提高到0.01,如果我们从较高的学习率开始训练,由于不稳定的梯度会导致网络发散。我们继续以0.01训练75个epoch,再以0.001训练30个epoch,以0.0001训练30个epoch。
  为了避免过拟合我们使用了dropout (神经元随机失效)层和数据增强的办法。在第一个连接层之后,速率为0.5的dropout层防止了层之间的联合依赖性(dropout强迫一个神经单元,和随机挑选出来的其他神经单元共同工作,达到好的效果。消除减弱了神经元节点间的联合依赖性,增强了泛化能力。)。对于数据增强,我们引入达到原始图像大小20%的随机缩放和平移。我们还在HSV色彩空间中随机调整图像的曝光和饱和度达1.5倍。

预测阶段:(无需反向传播,只需用训练好的模型进行前向传播)

1、前向推断:YOLO类似一个黑箱,输入是一个448*448*3的图像,输出的是7*7*30的张量。

7*7*30的解释:将输入图片分为7*7个网格,每个网格负责预测2个边界框和20个条件类别概率。每个边界框含5个参数(x,y,w,h,c),且这两个边界框中心都落在所在的网格中。

2、后处理:置信度过滤+NMS非极大值抑制(ps:训练阶段无需进行NMS,因为每个框在损失函数都占据一席之地)

后处理就是把产生的7*7*2=98个预测框筛选过滤,只保留目标结果,如下图所示。

将每个预测框的置信度和20个条件类别概率分别相乘,得到该框的类别全概率,共有98个预测框,故是一个20*98的张量

设张量第一行是狗的概率,先设置一个阈值(如0.2)将小概率设为0,再按照狗的概率从高到低排序,再进行非极大值抑制。

NMS处理详细过程:先将最大的概率(bbox_max)取出,再将其和后面的每一个概率(bbox_cur)作比较,若比较的IOU大于某个阈值,就认为重复识别了同一个物体,就将低概率的过滤掉(将概率设为0)


按照这个规则,将第二高的概率设为bbox_max,再将比bbox_max低概率的设为bbox_cur进行下一轮比较。最后每个类别只剩下两个预测框(图中bb47,bb15)。

 

最后将每个预测框最大的类别概率输出。

初读YOLOv1算法相关推荐

  1. nginx源码初读(8)--让烦恼从数据结构开始(ngx_event)

    nginx中的事件模块是一个很重要的模块,但这里作为初读,我们只简单看一下ngx_event的数据结构,至于模块和机制,留作之后再分析. 下面是结构体ngx_event_t的代码: typedef s ...

  2. 初读《设计模式之禅》

    读这本书的起因源于csdn学生大本营的一次活动<设计模式之禅>试读员招募,身为程序员兼之学生大本营的老师没有道理不踊跃参加了(参加时可没走任何后门),佛祖显灵,真的能有幸成为了试读员.从得 ...

  3. 敬天爱人 大道至简——初读《经营十二条》

    老板送了一本稻盛和夫的<经营十二条>让我看看,前段时间一直忙于应付考试与工作,直到今天才抽出时间好好研读了一番.从这本书里读到的第一印象就是日本人性格里特有的精神至上.团队意识.日本人强调 ...

  4. 目标检测算法YOLO-V1算法详解

    ❝ 前面我们一起学了SSD算法的相关知识,如下: SSD目标检测算法必须知道的几个关键点 目标检测算法SSD结构详解 ❞ 今天我们学习另一系列目标检测算法YOLO(You Only Look Once ...

  5. 初读《偷影子的人》观后感

    初读<偷影子的人>观后感 "为每一个你所偷来的影子找到点亮生命的小小光芒,为它们找回隐匿的记忆拼图,这便是我们对你的全部请托." < 偷影子的人>是法国作家 ...

  6. 15读《算法基础》有感——决策树

    15读<算法基础>有感--决策树 学完本学期的<算法设计与分析基础>,想对"决策树"做进一步的了解,于是读了Rod Stephens<算法基础> ...

  7. 初读Geoffrey Hinton颠覆之作《Dynamic Routing Between Capsules》

    最近在搜资料时忽然看到一条消息,Hinton老爷子在NIPS 2017大会上放了大招,宣布要革CNN和反向传播的命.武林盟主在武林大会上要推翻自己之前的武学门派,另起炉灶,如此精彩的大戏怎能不吃瓜围观 ...

  8. 模拟退huo算法的特点_兄弟,退火吗?—— 初窥模拟退火算法

    模拟退火算法(Simulated annealing, SA)是一种基于蒙特卡罗(Monte Carlo)思想设计的,常用于在较大的解空间中搜索近似全局最优解的优化算法.本文将从模拟退火算法的历史.形 ...

  9. 个人笔记——PointNet++初读

    PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space 在表述PointNet++之前,其实列出题 ...

最新文章

  1. arm linux下 chkntfs,XPE开机自动扫描相关_Windows Embedded Standard 7 嵌入式定制的技术博客_51CTO博客...
  2. Linux内核编译过程分析
  3. 在RHEL5下构建DHCP及DHCP中继服务器
  4. python爬虫怎么爬同一个网站的多页数据-请问爬虫如何爬取动态页面的内容?
  5. 全面讲解Python列表数组(二),列表分区/片,列表操作符,比较操作符,逻辑操作符,连接操作符,重复操作符,成员关系操作符;
  6. 使用dbcp连接池创建进行表的增删改查
  7. @ResponseBody//该注解会将返回值转为json格式并放到响应体中返回到前台
  8. 关于cocos2dx导入安卓项目至eclipse的诸多问题
  9. Android--SharedPreferences数据存储方案
  10. 正常网页开发如何解除父容器中子容器的浮动问题
  11. 中国联通企业介绍(联通笔试背景知识)
  12. Gerbview(高级pcb看图软件)官方正式版V9.20 | pcb文件怎么打开 | 含pdf转cad转换器和gerbview使用教程
  13. GOF设计模式(概念、原则、场景、优点、缺点、应用)
  14. IEEE standard for verilog (Expressions)
  15. w ndows 10关机快捷键,win10系统
  16. python语音引擎深度学习_基于Python的深度学习BP网络语音增强方法研究
  17. 固态硬盘:NVME 2.0 新技术 ZNS 自动分区:减少延迟,提高寿命
  18. linux开发板通过网线连接电脑(win10)连接网络问题
  19. 什么是VLAN?VXLAN?以及VLAN和VXLAN的区别?
  20. 微信小程序---页面刷新的几种方法

热门文章

  1. 计算机辅助外语教学,【外语教学论文】计算机辅助外语教学浅述(共3543字)
  2. vue中使用require动态获取图片地址
  3. int(size)中的size到底神马意思(mysql)
  4. FreeBSD下查看服务器型号和硬件信息
  5. 服务器挂微信显示登陆异常怎么办,王者荣耀微信大区登录异常怎么办 王者荣耀微信提示网络繁忙/登录失败如何解决...
  6. hadoop集群搭建及易踩坑收录
  7. iOS获取苹果商店应用编号APPID
  8. php mysql 柱状图,使用EChat通过php连接mysql数据库从而实现将数据转换为柱状图
  9. 如何设置计算机自动连接宽带,Win7系统如何设置开机自动连接宽带?
  10. java中finally语句是否一定会被执行