每当听到有人问“如何入门计算机视觉”这个问题时,其实我内心是拒绝的,为什么呢?因为我们说的计算机视觉的发展史可谓很长了,它的分支很多,而且理论那是错综复杂交相辉映,就好像数学一样,如何学习数学?这问题似乎有点笼统、有点宽泛。所以我都会具体问问你想入门计算机视觉的哪个话题,只有顺着一个话题理论联合实际,才有可能扩展到几个话题。

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帧左右。先看一下打印的日志:

 v2的日志信息:

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!
百度百科:FLOPS(即“每秒浮点运算次数”,“每秒峰值速度”),是“每秒所执行的浮点运算次数”(floating-point operations per second)的缩写。它常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。正因为FLOPS字尾的那个S,代表秒,而不是复数,所以不能省略掉。
在这里所谓的“浮点运算”,实际上包括了所有涉及小数的运算。这类运算在某类应用软件中常常出现,而它们也比整数运算更花时间。现今大部分的处理器中,都有一个专门用来处理浮点运算的“浮点运算器”(FPU)。也因此FLOPS所量测的,实际上就是FPU的执行速度。而最常用来测量FLOPS的基准程式(benchmark)之一,就是Linpack
可能的原因:yolov2是一个纵向自上而下的网络架构,随着channel数目的不断增加,FLOPS是不断增加的,而v3网络架构是横纵交叉的,看着卷积层多,其实很多多channel的卷积层没有继承性,另外,虽然yolov3增加了anchor centroid,但是对ground truth的估计变得更加简单,每个ground truth只匹配一个先验框,而且每个尺度只预测3个框,v2预测5个框。这样的话也降低了复杂度。

所以这发展的历程应该是这样的:

yolo——SSD——yolov2——FPN、Focal loss、DSSD......——yolov3

最后总结,yolo算法的性能一直都没有被v2发挥出来,而真正被v3发挥出来了,v3这次的借鉴效果实在是太好了。

欢迎加入QQ交流群864933024

yolo类检测算法解析——yolo v3的更多相关文章

  1. (六)目标检测算法之YOLO

    系列文章链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...

  2. 机器学习: Viola-Jones 人脸检测算法解析(二)

    上一篇博客里,我们介绍了VJ人脸检测算法的特征,就是基于积分图像的矩形特征,这些矩形特征也被称为Haar like features, 通常来说,一张图像会生成一个远远高于图像维度的特征集,比如一个 ...

  3. 机器学习: Viola-Jones 人脸检测算法解析(一)

    在计算机视觉领域中,人脸检测或者物体检测一直是一个非常受关注的领域,而在人脸检测中,Viola-Jones人脸检测算法可以说是非常经典的一个算法,所有从事人脸检测研究的人,都会熟悉了解这个算法,Vio ...

  4. CNN之yolo目标检测算法笔记

    本文并不是详细介绍yolo工作原理以及改进发展的文章,只用做作者本人回想与提纲. 1.yolo是什么 输入一张图片,输出图片中检测到的目标和位置(目标的边框) yolo名字含义:you only lo ...

  5. (七)目标检测算法之SSD

    系列博客链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-CNN https://www.cnbl ...

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

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

  7. 目标检测算法的总结(R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD、FNP、ALEXnet、RetianNet、VGG Net-16)

    目标检测解决的是计算机视觉任务的基本问题:即What objects are where?图像中有什么目标,在哪里?这意味着,我们不仅要用算法判断图片中是不是要检测的目标, 还要在图片中标记出它的位置 ...

  8. 目标检测算法YOLO算法介绍

    YOLO算法(You Only Look Once) 比如你输入图像是100x100,然后在图像上放一个网络,为了方便讲述,此处使用3x3网格,实际实现时会用更精细的网格(如19x19).基本思想是, ...

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

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

随机推荐

  1. 关于创建本地docker仓库

    从远程仓库中下载regitstry镜像文件,下载后运行命令即可:docker run -p 5000:5000 -d registry

  2. 倒计时js

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. solr 7.7 搭建和搜索

    最近做了个solr搜索的demo, 用的是solr7.7,之前网上好多文章搭建solr都是5.5+tomcat.. 自己摆弄了下,发现solr7.7和5.5 的部分文件夹有些改动,没有深究原理也就没有 ...

  4. Docker(2):使用Dockerfile创建支持SSH服务的镜像

    1.创建工作目录 # mkdir sshd_ubuntu # ls 在其中,创建Dockerfile和run.sh文件 # cd sshd_ubuntu/ # touch Dockerfile run ...

  5. web开发-Django博客系统

    项目界面图片预览 项目代码github地址 项目完整流程 项目流程: 1 搞清楚需求(产品经理) (1) 基于用户认证组件和Ajax实现登录验证(图片验证码) (2) 基于forms组件和Ajax实现 ...

  6. 【题解】洛谷P3660 [USACO17FEB]Why Did the Cow Cross the Road III

    题目地址 又是一道奶牛题 从左到右扫描,树状数组维护[左端点出现而右端点未出现]的数字的个数.记录每个数字第一次出现的位置. 若是第二次出现,那么删除第一次的影响. #include <cstd ...

  7. 3-STM32带你入坑系列(自己封装点亮一个灯的库--Keil)

    2-STM32带你入坑系列(点亮一个灯--Keil) 首先建一个stm32f103x.h的文件,然后 #include "stm32f103x.h" 还记得上一节 现在呢就是做一个 ...

  8. SpringCloud(8)微服务监控Spring Boot Admin

    1.简介 Spring Boot Admin 是一个管理和监控Spring Boot 应用程序的开源软件.Spring Boot Admin 分为 Server 端和 Client 端,Spring ...

  9. SpringCloud(7)服务链路追踪Spring Cloud Sleuth

    1.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可.本文主要讲述服务追踪组件zipki ...

  10. HashMap 与 HashSet 联系

    HashMap实现 Map接口 HashSet实现Collection接口 HashSet底层是HashMap  好的 记住这个就可以了 HashSet只存放key, value:   private ...