真实世界带来的挑战,是有限的数据以及小型硬件,诸如手机和树莓派等,这些硬件无法运行复杂的深度学习模型。这篇文章演示了如何使用树莓派进行对象检测,就像公路上的汽车,冰箱里的橘子,文件上的签名,太空中的特斯拉。
免责声明:我正在用更少的数据和无硬件的方式构建 nanonets.com 来帮助建立机器学习。如果你没有耐心继续阅读下去,可以直接翻阅到底部查看 Github 的仓库。
检测孟买路上的车辆。
为什么要检测对象?为什么使用树莓派?
树莓派是一款优秀的硬件,它已经捕获了与售卖 1500 万台设备同时代的人的心,甚至于黑客用其构建了更酷的项目。鉴于深度学习和树莓派相机的流行,我们认为如果能够通过树莓派进行深度学习来检测任何对象,会是一件非常有意义的事情。
现在你将能够在你的自拍中发现一个 potobomber,有人进入 Harambe 的笼子,在那里有人让 Sriracha 或 Amazon 送货员进入你的房子。
什么是对象检测?
20M 年的进化使人类的视觉得到了相当大的进化。人类大脑有 href="http://discovermagazine.com/1993/jun/thevisionthingma227">30% 的神经元负责处理视觉(相比之下,触觉和听觉分别为 8% 和 3%)。与机器相比,人类有两大优势。一是立体视觉,二是近乎无限的训练数据(一个 5 岁的婴儿,以 30fps 的速度获取大约 2.7B 的图像)。
为了模仿人类层次的表现水平,科学家将视觉感知任务分解为四个不同的类别。分类,为整个图像指定一个标签
Localization,为特定标签指定一个边框
对象检测,在图像中绘制多个边界框
图像分割,创建图像中物体所在位置的精确部分
对于各种应用来说,对象检测已经足够好了(即使图像分割结果更为精确,但它受到创建训练数据的复杂性影响。对于一个人类标注者来说,分割图像所花的时间比绘制边界框要多 12 倍;这是更多的轶事,但缺乏一个来源)。而且在检测对象之后,可以单独从边界框中分割对象。
使用对象检测:
对象检测具有重要的现实意义,已经在各行业中被广泛使用。以下是相关示例:
我如何使用对象检测来解决我自己的问题?
对象检测可用来回答各种问题。这是粗略的分类:在我的图像中是否存在对象?例如,我家有入侵者么。
对象在哪里,在图像中?例如,当一辆汽车试图在世界各地行驶时,知道物体在哪里是很重要的。
有多少个对象,它们都在图像中么? 对象检测是计算物体的最有效的方法之一。例如,一个仓库里的架子上有多少箱子。
什么是不同类型的对象在图像中?比如哪个动物在动物园的哪个地方?
对象的大小是多少? 尤其是使用静态相机时,很容易计算出物体的大小。比如芒果的大小是多少?
**不同对象如何相互作用?**足球场上的阵型如何影响结果?
与时间有关的对象在何处(追踪对象)比如追踪像火车这样的移动物体,并计算它的速度等。
20 行以下代码中的对象检测
YOLO 算法可视化。
有多种用于对象检测的模型/体系结构。在速度、尺寸和精度之间进行权衡。我们选了一个最受欢迎的:YOLO(您只看了一次)。并在 20 行以下的代码中展示了它的工作原理(如果忽略注释的 haunted)。
注意:这是伪代码,不会成为一个有用的例子。它有一个接近 CNN 标准的部分黑盒,如下所示。
YOLO 中的卷积神经网络结构。
#this is an Image of size 140x140. We will assume it to be black and white (ie only one channel, it would have been 140x140x3 for rgb)
image = readImage()
#We will break the Image into 7 coloumns and 7 rows and process each of the 49 different parts independently
NoOfCells = 7
#we will try and predict if an image is a dog, cat, cow or wolf. Therfore the number of classes is 4
NoOfClasses = 4
threshold = 0.7
#step will be the size of step to take when moving across the image. Since the image has 7 cells step will be 140/7 = 20
step = height(image)/NoOfCells
#stores