yolo类检测算法解析——yolo v3
每当听到有人问“如何入门计算机视觉”这个问题时,其实我内心是拒绝的,为什么呢?因为我们说的计算机视觉的发展史可谓很长了,它的分支很多,而且理论那是错综复杂交相辉映,就好像数学一样,如何学习数学?这问题似乎有点笼统、有点宽泛。所以我都会具体问问你想入门计算机视觉的哪个话题,只有顺着一个话题理论联合实际,才有可能扩展到几个话题。
yolo类算法,从开始到现在已经有了3代,我们称之为v1、v2、v3,一路走来,让人能感觉到的是算法的性能在不断的改进,以至于现在成为了开源通用目标检测算法的领头羊(ps:虽然本人一直都很欣赏SSD,但是不得不说V3版本已经达到目前的颠覆)。一直以来,有一个问题困扰许久,那就是如何检测两个距离很近的同类的物体,当然又或者是距离很近的不同类的物体?绝大部分算法都会对传入的data做resize到一个更小的resolution,它们对于这种情况都会给出一个目标框,因为在它们的特征提取或者回归过程看来,这就是一个物体(可想本来就很近,一放缩之间的近距离越发明显了),而事实上这是两个同(或不同)类型的物体靠的很近,这个难题是目标检测和跟踪领域的一个挑战。就好像对小目标的检测,一直以来也被看做是算法的一种评估。但是啊,v3版本却做到了,它对这种距离很近的物体或者小物体有很好的鲁棒性,虽然不能保证百分百,但是这个难题得到了很大程度的解决,激发我对yolo类算法的研究。这也是为什么写这篇文章的目的,在于见证一下这个算法的神奇。其实,百分百的检测,在我看来事实上是不存在的,随着时间的推移,环境的变化,任何妄言百分百准确的算法都是扯,只能是相互调整吧。前几天uber撞人事件其实我最关注的应该是哪个环节存在的问题,还需要改进,撞人是不可避免的,无人车的存在不是让事故不发生,而是让社会进步,科技发展,逐步降低事故发生率的同时改善人们的生活质量。
yolo的v1和v2都不如SSD算法,原谅这么直白,原因是v1版本的448和v2版本的416都不如SSD的300,当然以上结论都是实验测的,v3版本的416应该比SSD512好,可见其性能。
对官方yolo做了实验,实验中,采用同一个视频、同一张显卡,在阈值为0.3的前提下,对比了v3和v2的测试效果之后,有了下面两个疑问:
1.为什么v3和v2版本的测试性能提高很大,但速度却没有降低?
2.为什么v3性能上能有这么大的改进?或者说为什么v3在没有提高输入数据分辨率的前提下,对小目标检测变得这么好?
要回答上述两个问题,必须要看看作者发布的v3论文了,将v3和v2不一样的地方总结一下:
- loss不同:作者v3替换了v2的softmax loss 变成logistic loss,而且每个ground truth只匹配一个先验框。
- anchor bbox prior不同:v2作者用了5个anchor,一个折衷的选择,所以v3用了9个anchor,提高了IOU。
- detection的策略不同:v2只有一个detection,v3一下变成了3个,分别是一个下采样的,feature map为13*13,还有2个上采样的eltwise sum,feature map为26*26,52*52,也就是说v3的416版本已经用到了52的feature map,而v2把多尺度考虑到训练的data采样上,最后也只是用到了13的feature map,这应该是对小目标影响最大的地方。
- backbone不同:这和上一点是有关系的,v2的darknet-19变成了v3的darknet-53,为啥呢?就是需要上采样啊,卷积层的数量自然就多了,另外作者还是用了一连串的3*3、1*1卷积,3*3的卷积增加channel,而1*1的卷积在于压缩3*3卷积后的特征表示,这波操作很具有实用性,一增一减,效果棒棒。
为什么有这么大的提高?我指的是v2和v3比,同样是416的feature map,我感觉是v2作者当时也是做了很多尝试和借鉴,实现了匹敌SSD的效果,但是他因为被借鉴的内容所困扰,导致性能的停留,因此v3再借鉴,应该是参考了DSSD和FPN,这应该是之后的潮流了,做了一下结果性能提高很大,可能作者本人都没想到。但是作者目前没有写篇论文,认为没有创造性实质性的改变,写了一个report,科研的精神值得肯定!如果对比v2和v3你会发现反差确实很大,所以上面的问题才不奇怪。
又为什么速度没有下降?电脑上同环境测都是15帧左右。先看一下打印的日志:
Demo
layer filters size input output
conv x / x x -> x x 0.299 BFLOPs
max x / x x -> x x
conv x / x x -> x x 1.595 BFLOPs
max x / x x -> x x
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
max x / x x -> x x
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
max x / x x -> x x
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
max x / x x -> x x
conv x / x x -> x x1024 1.595 BFLOPs
conv x / x x1024 -> x x 0.177 BFLOPs
conv x / x x -> x x1024 1.595 BFLOPs
conv x / x x1024 -> x x 0.177 BFLOPs
conv x / x x -> x x1024 1.595 BFLOPs
conv x / x x1024 -> x x1024 3.190 BFLOPs
conv x / x x1024 -> x x1024 3.190 BFLOPs
route
conv x / x x -> x x 0.044 BFLOPs
reorg / x x -> x x
route
conv x / x x1280 -> x x1024 3.987 BFLOPs
conv x / x x1024 -> x x 0.043 BFLOPs
detection
mask_scale: Using default '1.000000'
Loading weights from yolo-voc.weights...Done!
v3的日志信息:
Demo
layer filters size input output
conv x / x x -> x x 0.299 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
res x x -> x x
conv x / x x -> x x1024 1.595 BFLOPs
conv x / x x1024 -> x x 0.177 BFLOPs
conv x / x x -> x x1024 1.595 BFLOPs
res x x1024 -> x x1024
conv x / x x1024 -> x x 0.177 BFLOPs
conv x / x x -> x x1024 1.595 BFLOPs
res x x1024 -> x x1024
conv x / x x1024 -> x x 0.177 BFLOPs
conv x / x x -> x x1024 1.595 BFLOPs
res x x1024 -> x x1024
conv x / x x1024 -> x x 0.177 BFLOPs
conv x / x x -> x x1024 1.595 BFLOPs
res x x1024 -> x x1024
conv x / x x1024 -> x x 0.177 BFLOPs
conv x / x x -> x x1024 1.595 BFLOPs
conv x / x x1024 -> x x 0.177 BFLOPs
conv x / x x -> x x1024 1.595 BFLOPs
conv x / x x1024 -> x x 0.177 BFLOPs
conv x / x x -> x x1024 1.595 BFLOPs
conv x / x x1024 -> x x 0.088 BFLOPs
detection
route
conv x / x x -> x x 0.044 BFLOPs
upsample 2x x x -> x x
route
conv x / x x -> x x 0.266 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
detection
route
conv x / x x -> x x 0.044 BFLOPs
upsample 2x x x -> x x
route
conv x / x x -> x x 0.266 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.177 BFLOPs
conv x / x x -> x x 1.595 BFLOPs
conv x / x x -> x x 0.353 BFLOPs
detection
Loading weights from yolov3.weights...Done!
所以这发展的历程应该是这样的:
yolo——SSD——yolov2——FPN、Focal loss、DSSD......——yolov3
最后总结,yolo算法的性能一直都没有被v2发挥出来,而真正被v3发挥出来了,v3这次的借鉴效果实在是太好了。
欢迎加入QQ交流群864933024
yolo类检测算法解析——yolo v3的更多相关文章
- (六)目标检测算法之YOLO
系列文章链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...
- 机器学习: Viola-Jones 人脸检测算法解析(二)
上一篇博客里,我们介绍了VJ人脸检测算法的特征,就是基于积分图像的矩形特征,这些矩形特征也被称为Haar like features, 通常来说,一张图像会生成一个远远高于图像维度的特征集,比如一个 ...
- 机器学习: Viola-Jones 人脸检测算法解析(一)
在计算机视觉领域中,人脸检测或者物体检测一直是一个非常受关注的领域,而在人脸检测中,Viola-Jones人脸检测算法可以说是非常经典的一个算法,所有从事人脸检测研究的人,都会熟悉了解这个算法,Vio ...
- CNN之yolo目标检测算法笔记
本文并不是详细介绍yolo工作原理以及改进发展的文章,只用做作者本人回想与提纲. 1.yolo是什么 输入一张图片,输出图片中检测到的目标和位置(目标的边框) yolo名字含义:you only lo ...
- (七)目标检测算法之SSD
系列博客链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...
- 检测算法简介及其原理——fast R-CNN,faster R-CNN,YOLO,SSD,YOLOv2,YOLOv3
1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...
- 目标检测算法的总结(R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD、FNP、ALEXnet、RetianNet、VGG Net-16)
目标检测解决的是计算机视觉任务的基本问题:即What objects are where?图像中有什么目标,在哪里?这意味着,我们不仅要用算法判断图片中是不是要检测的目标, 还要在图片中标记出它的位置 ...
- 目标检测算法YOLO算法介绍
YOLO算法(You Only Look Once) 比如你输入图像是100x100,然后在图像上放一个网络,为了方便讲述,此处使用3x3网格,实际实现时会用更精细的网格(如19x19).基本思想是, ...
- 【深度学习】目标检测算法总结(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)
目标检测是很多计算机视觉任务的基础,不论我们需要实现图像与文字的交互还是需要识别精细类别,它都提供了可靠的信息.本文对目标检测进行了整体回顾,第一部分从RCNN开始介绍基于候选区域的目标检测器,包括F ...
随机推荐
- 在windows下远程访问linux桌面
一.安装xrdp工具: # yum install xrdp # yum install tigervnc-server # service xrdp start 以上三个命令执行完毕安装完 ...
- Bootstrap日期和时间表单组件
http://www.bootcss.com/p/bootstrap-datetimepicker/ 项目 MarketPoint
- .NET平台下,初步认识AutoMapper
初步认识AutoMapper AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象 前言 通常 ...
- ESP8266天线问题
http://www.icxbk.com/ask/detail/28832.html 目前市面上常见的外接天线包括 1.FPC天线,就是一小块柔性PCB,上面走一个铜线,下方不覆铜,然后一般带一个贴纸 ...
- 终于有人把“TCC分布式事务”实现原理讲明白了!
之前网上看到很多写分布式事务的文章,不过大多都是将分布式事务各种技术方案简单介绍一下.很多朋友看了还是不知道分布式事务到底怎么回事,在项目里到底如何使用. 所以这篇文章,就用大白话+手工绘图,并结合一 ...
- codeforces#1011C. Fly (二分,注意精度)
题意:火箭经过1到n号星球,并回到1号星球,现在给出每消耗一砘燃油能带起的火箭质量a[i]和b[i],a[i]代表在第i个星球起飞,b[i]代表在第i个星球降落.求出最少消耗的汽油.保证:如果不能完成 ...
- 解决import模块后提示无此模块的问题
最近在工作中发现一个奇怪的问题: 明明已经装上了,但是还提示找不到该模块,没办法,我又去site-package文件下面看了: 发现Linux下自带的python2.7里面装上了该模块(我在root用 ...
- mybatis 使用resultMap实现表间关联
AutoMapping auto mapping,直译过来就是自动映射,工作原理大概如下: 假设我们有一张表,表名为person,包含id,name,age,addr这4个字段 mysql> d ...
- 乐观锁vs悲观锁
引言 为什么需要锁(并发控制) 在并发的环境中,会存在多个用户同时更新同一条数据,这时就会产生冲突. 冲突结果: 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失. 脏读:当一个事 ...
- 数据降维之多维缩放MDS(Multiple Dimensional Scaling)
网上看到关于数据降维的文章不少,介绍MDS的却极少,遂决定写一写. 考虑一个这样的问题.我们有n个样本,每个样本维度为m.我们的目标是用不同的新的k维向量(k<<m)替代原来的n个m维向量 ...