导读
以前一直和队员强调,写的推文要尽量让别人看得懂。但是出于某些原因和想法,我决定这次剑走偏锋,真正的深入一个算法,让大家能直观的了解下一个算法到底是怎么work的。
那么到底是一种什么算法呢?这个算法叫YOLO, 英文全称是You Only Look Once。名称确实有点迷人,小编曾经深深陷入,无法自拔。曾经为了吃透这个算法,论文、代码反复看,真的很烧脑,但是最后发现其实也没有这么难,哈哈~~~
好的,其它不带乱扯的了,直接进入主题。
坐稳了没?要开车了哦
先来看个小视频,这个是我当时用自己的数据集train了一个能识别自己杯子的视频。
再放出一张算法作者在论文中用到的一张图片。
简单来说,这个算法是依赖于一个深度的神经网络。这个神经网络的输入呢,就是图像,那么经过大量的数据对神经网络进行训练和参数的不断更新之后,这个神经网络就能准确的输出图像中物体的种类和位置信息。(好的,下面正式讲解算法)
这个算法呢,成功地将物体识别问题转化成了端对端的回归学习问题。为什么这样说,我们参考一下其它的物体检测算法,比如RCNN、Fast-RCNN、Faster-RCNN。RCNN系列算法呢,是基于区域提议的一种算法,简单来说,如果计算机对那个区域感兴趣,那么就会把该区域提取出来再放入一个神经网络,对该物体的类别进行预测。像这种从输入到输出经过多个处理就不能称之为端对端的算法。而YOLO则是直接对结果进行预测。
这个算法的核心在于它把图片划分成了7*7(可以修改,比如定义成19*19也是可以的)个小的区域,在论文中把每个区域叫做cell,那我把它译作网格好了。看划分的效果图。
每个网格会对应一个向量输出,这个向量里面就包含了物体各种信息,比如物体的位置、大小和类别。当神经网络认为物体落在某个网格上的时候,那么这个网格就会做出相应,并输出物体中心点落在该网格上的概率。因为每个网格都有输出,但是真正要将其预测可视化前还要进行非极大值抑制,否则会出现一堆杂乱的框。如果根据论文中定义的参数的话,那就会输出7*7*2=98个框。就像下面这张图。
那么问题又来了,假如同时有两个物体的中心点落在同一个网格上怎么办?虽然这个问题出现的概率不高,但是还是有解决的办法的。那就是用两个Anchor box。也就是说一个网格可以输出两个或者多个(可以定义多个)边界框。可以看到下图两个形状不一样的边界框。
那么最后的输出就有了7*7个向量,不过关于这个向量其实是人为的划分,我们知道,一个这个网络包括了卷积层、池化层和全连接层,一般来说全连接层放到最后作为输出,7*7的个向量就是从输出里面划分的。
其中输出总的来说是包括了物体的边界框信息和物体的类别。边界框
Bounding box信息包含5个数据值,分别是x,y,w,h,和confidence。物体的类别输出则是一个one-hot编码。
损失函数
那这个算法是根据什么标准来学习的呢?下面是损失函数的设计。
可以说,损失函数的设计是直接指导了神经网络的学习方向的。那么可以看到损失函数里面的几个学习的指标:X(物体相对于网格左上角顶点的水平位移),Y(物体相对于网格左上角顶点的垂直位移),W、H(物体的宽、高),C(为物体类别的one-hot编码),P(置信度)。
网络结构
上图是神经网络的设计,作者在参考了google的Inception的基础上,加入了1*1大小卷积核的卷积层,目的是为了加深特征向量。
有了物体信息的输出,最后就可以对输出进行可视化了,也有了上面视频中显示的那样。
算法并不难,难就难在对基础知识的掌握和理解。这个算法因为是直接回归,所以速度非常快,相对于RCNN系列算法来说,精度可能是一个不足,但是最新的YOLO v3版本已经在精度上的表现与RCNN系列算法渐渐接近了。
Finallly, 上面的都是根据自己的理解写的,因为小编水平有限,难免做到没有错漏,如有不当之处,欢迎指出。
End
我们是图灵智能创新团队,
同时也是广东海洋大学第一个人工智能创新团队,
我们团队的主要方向有:计算机视觉和自然语言处理。
本公众号主要面向对人工智能感兴趣的读者,
如果想了解更多,欢迎关注我们!
领取专属 10元无门槛券
私享最新 技术干货