学习
实践
活动
工具
TVP
写文章

实时的物体检测是怎么实现的?

导读

以前一直和队员强调,写的推文要尽量让别人看得懂。但是出于某些原因和想法,我决定这次剑走偏锋,真正的深入一个算法,让大家能直观的了解下一个算法到底是怎么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

我们是图灵智能创新团队,

同时也是广东海洋大学第一个人工智能创新团队,

我们团队的主要方向有:计算机视觉和自然语言处理。

本公众号主要面向对人工智能感兴趣的读者,

如果想了解更多,欢迎关注我们!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180608G0Q0IP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券