Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

浩克匠心作者

进击的YOLOv3,目标检测网络的巅峰之作 | 内附实景大片

作者丨浩克匠心

研究方向丨基于深度学习的实时目标检测

知乎专栏丨计算视觉与深度学习的小屋

YOLOv3的前世今生

2015 年,R-CNN 横空出世,目标检测 DL 世代大幕拉开。

各路豪杰快速迭代,陆续有了 SPP,fast,faster 版本,至 R-FCN,速度与精度齐飞,区域推荐类网络大放异彩。

奈何,未达实时检测之基准,难获工业应用之青睐。

此时,凭速度之长,网格类检测异军突起,先有 YOLO,继而 SSD,更是摘实时检测之桂冠,与区域推荐类二分天下。然准确率却时遭世人诟病。

遂有 JR 一鼓作气,并 coco,推 v2,增加输出类别,成就 9000。此后一年,作者隐遁江湖,逍遥 twitter。偶获灵感,终推 v3,横扫武林!

准确率不再是短板

自从 YOLO 诞生之日起,它就被贴上了两个标签:

  • 速度很快

  • 不擅长检测小物体

而后者,成为了很多人对它望而却步的原因。

由于原理上的限制,YOLO 仅检测最后一层卷积输出层,小物体像素少,经过层层卷积,在这一层上的信息几乎体现不出来,导致难以识别。

YOLOv3 在这部分提升明显,先看看小物体的识别

▲ YOLOv3的识别结果

直观地看下和 YOLOv2 的对比图如下。可以看出,对于小物体的识别,提高非常明显。

无论是传统的模式识别图像检测,还是基于 CNN 的视觉检测,对于紧凑密集或者高度重叠目标的检测通常是非常困难的。比如对合影的人群检测在 YOLOv2 上的结果:

而下面是 v3 的结果

一次检测到图中 90% 的人,还增加了 tie(领带)这个新类别,非常惊艳!

再看看模型的泛化能力如何:

骷髅并不在训练数据集中,但是通过训练模型强大的泛化能力,自动将其归类到了人类(也算是最为合理的近似处理了)。

这在 YOLOv2 中是检测不到的。

那么,模型泛化能力很强的副作用,就是分类结果跑偏,比如下面这张 coser 的识别图,最左侧的人识别成了马:

训练和检测都很快

论文中做了详尽的对比。 

和前辈们比,YOLO 的速度非常快,比 R-CNN 快 1000 倍,比 Fast R-CNN 快 100 倍。 

和同辈们比,YOLOv3-608 检测准确率比 DSSD 更高,接近 FPN,但是检测时间却只用了后面两者的三分之一不到。 

原因如论文中所说,它在测试时观察整张图像,预测会由图像中的全局上下文(global context)引导。它还通过单一网络评估做出预测,而不像 R-CNN 这种系统,一张图就需要成千上万次预测。

用了哪些黑科技?

1. 多级预测

终于为 YOLO 增加了 top down 的多级预测,解决了 YOLO 颗粒度粗,对小目标无力的问题。

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,这应该是对小目标影响最大的地方。

在论文中从单层预测五种 boundingbox 变成每层 3 种 boundongbox。

2. loss不同

作者 v3 替换了 v2 的 softmax loss 变成 logistic loss,由于每个点所对应的 bounding box 少并且差异大,每个 bounding 与 ground truth 的 matching 策略变成了 1 对 1。

当预测的目标类别很复杂的时候,采用 logistic regression 进行分类是更有效的,比如在 Open Images Dataset 数据集进行分类。

在这个数据集中,会有很多重叠的标签,比如女人、人,如果使用 softmax 则意味着每个候选框只对应着一个类别,但是实际上并不总是这样。复合标签的方法能对数据进行更好的建模。

3. 加深网络

采用简化的 residual block 取代了原来 1×1 和 3×3 的 block(其实就是加了一个 shortcut,也是网络加深必然所要采取的手段)。

这和上一点是有关系的,v2 的 darknet-19 变成了 v3 的 darknet-53,为啥呢?就是需要上采样啊,卷积层的数量自然就多了,另外作者还是用了一连串的 3*3、1*1 卷积,3*3 的卷积增加 channel,而 1*1 的卷积在于压缩 3*3 卷积后的特征表示。

4. Router

由于 top down 的多级预测,进而改变了 router(或者说 concatenate)时的方式,将原来诡异的 reorg 改成了 upsample。

下一代YOLO长啥样?

1. mAP 会继续提高:随着模型训练越来越高效,神经网络层级的不断加深,信息抽象能力的不断提高,以及一些小的修修补补,未来的目标检测应用mAP会不断提升。 

2. 实时检测会成为标配:目前所谓的“实时”,工业界是不认可的。为什么呢,因为学术圈的人,验证模型都是建立在 TitanX 或者 Tesla 这类强大的独立显卡上,而实际的潜在应用场景中,例如无人机/扫地/服务机器人/视频监控等,是不会配备这些“重型装备”的。所以,在嵌入式设备中,如 FPGA,轻量级 CPU 上,能达到的实时,才是货真价实的。 

3. 模型小型化成为重要分支:类似于 tiny YOLO 的模型分支会受到更多关注。模型的小型化是应用到嵌入式设备的重要前提。而物联网机器人无人机等领域还是以嵌入式设备为主的。模型剪枝/二值化/权值共享等手段会更广泛的使用。

说点题外话

YOLO 让人联想到龙珠里的沙鲁(cell),不断吸收同化对手,进化自己,提升战斗力:YOLOv1 吸收了 SSD 的长处(加了 BN 层,扩大输入维度,使用了 Anchor,训练的时候数据增强),进化到了 YOLOv2; 

吸收 DSSD 和 FPN 的长处,仿 ResNet 的 Darknet-53,仿 SqueezeNet 的纵横交叉网络,又进化到 YOLO 第三形态。 

但是,我相信这一定不是最终形态。让我们拭目以待吧!

YOLOv3实景大片儿

这周忙里偷闲,把 darknet 的代码撸了一遍,里面有趣的东西很多。

能看出来作者是有野心的,YOLO 不只是一个目标检测应用,它还是一个完全基于 C 语言的通用神经网络架构,以及很多以此为基础的深度学习应用,比如基于 RNN 的莎士比亚戏剧剧本自动生成器

基于策略网络的 darknet 版阿法狗(DarkGo):

基于 GAN 的 darknet 版 Deep Dream(Nightmare):

挑战 SqueezeNet 的压缩网络 TinyYOLO(Redmon 号称后者比前者更快、小、准)等等。

当然,做得最好的还是目标检测。darknet 自带有视频检测,及网络摄像头实时视频检测。 

但是,目前网上介绍的 YOLO 的文章多是用的论文和 Github 工程自带的 sample 图片(dog,kite…),其实这不太公平。 

在源代码基础上加了一点保存视频的代码(代码链接在文尾),生成了如下的视频,看看当 Mr Bean 遇到 YOLO 会产生什么样的化学反应! 


▲ YOLOv3效果展示

https://zhuanlan.zhihu.com/p/36478097

注:本视频基于 coco 数据集,YOLOv3 cfg 和 weights。检测视频没有声音,音轨是后加的。

存在一些识别错误,但是整体来说,亮点很多。

截取几个瞬间

▲ 性能提升最大的是小物体或者远处的物体识别

▲ 重叠遮挡物体的识别

▲ 运动模糊物体的识别

▲ 高密度汽车的识别

▲ 密集人群识别

相关链接

[1]. 论文

https://pjreddie.com/media/files/papers/YOLOv3.pdf

[2]. 翻译

https://zhuanlan.zhihu.com/p/34945787

[3]. 代码

https://github.com/pjreddie/darknet

[4]. 官网

https://pjreddie.com/darknet/yolo/

[5]. YouTube

https://www.youtube.com/watch?v=MPU2HistivI

[6]. 旧版

https://pjreddie.com/darknet/yolov2/

https://pjreddie.com/darknet/yolov1/

[7]. 源码分享

https://github.com/muyiguangda/darknet

[8]. YOLOv3在Windows下的配置(无GPU)

https://blog.csdn.net/baidu_36669549/article/details/79798587

PaperWeekly
PaperWeekly

推荐、解读、讨论和报道人工智能前沿论文成果的学术平台。

入门深度学习实时目标检测计算机视觉R-CNNYOLOv3模式识别图像检测视觉检测
194
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

二值化技术

二值化是将像素图像转换为二进制图像的过程。

基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

剪枝技术

剪枝顾名思义,就是删去一些不重要的节点,来减小计算或搜索的复杂度。剪枝在很多算法中都有很好的应用,如:决策树,神经网络,搜索算法,数据库的设计等。在决策树和神经网络中,剪枝可以有效缓解过拟合问题并减小计算复杂度;在搜索算法中,可以减小搜索范围,提高搜索效率。

模式识别技术

模式识别(英语:Pattern recognition),就是通过计算机用数学技术方法来研究模式的自动处理和判读。 我们把环境与客体统称为“模式”。 随着计算机技术的发展,人类有可能研究复杂的信息处理过程。 信息处理过程的一个重要形式是生命体对环境及客体的识别。其概念与数据挖掘、机器学习类似。

卷积技术

机器人技术技术

机器人学(Robotics)研究的是「机器人的设计、制造、运作和应用,以及控制它们的计算机系统、传感反馈和信息处理」 [25] 。 机器人可以分成两大类:固定机器人和移动机器人。固定机器人通常被用于工业生产(比如用于装配线)。常见的移动机器人应用有货运机器人、空中机器人和自动载具。机器人需要不同部件和系统的协作才能实现最优的作业。其中在硬件上包含传感器、反应器和控制器;另外还有能够实现感知能力的软件,比如定位、地图测绘和目标识别。之前章节中提及的技术都可以在机器人上得到应用和集成,这也是人工智能领域最早的终极目标之一。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

策略网络技术

在强化学习中,策略网络指一组相对稳定的关系,这些关系具有非等级和相互依赖的性质,将各个行为者(actor)联系起来。

无人机技术

无人机(Uncrewed vehicle、Unmanned vehicle、Drone)或称无人载具是一种无搭载人员的载具。通常使用遥控、导引或自动驾驶来控制。可在科学研究、军事、休闲娱乐用途上使用。

上采样技术

在数字信号处理中,上采样、扩展和内插是与多速率数字信号处理系统中的重采样过程相关的术语。 上采样可以与扩展同义,也可以描述整个扩展和过滤(插值)过程。

物体识别技术

计算机视觉领域的一个分支,研究物体的识别任务

推荐文章
北京航空航天大学・飞行器设计与工程(航天)--结构优化・本科(目前研一)
666
请问复现过程容易吗
为什么我用demo 测试视频时,没有自动保存了?请问检测视频后,视频保存到什么地方了?
编译出错: ./src/image.c: In function ‘draw_train_chart’: ./src/image.c:545:13: warning: implicit declaration of function ‘CV_RGB’; did you mean ‘CV_8U’? [-Wimplicit-function-declaration] cvSet(img, CV_RGB(255, 255, 255), 0); ^~~~~~ CV_8U ./src/image.c:545:13: error: incompatible type for argument 2 of ‘cvSet’ compilation terminated due to -Wfatal-errors. Makefile:131: recipe for target 'obj/image.o' failed make: *** [obj/image.o] Error 1