大家好,今天给各位分享走亲访友时不要惊慌!一步一步教你如何使用Mask RCNN和Python创建一个抢车位工具的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
尽管熙熙攘攘,此时最困难的问题或许是如何在社区、商场、菜市场的人群中精准定位一个“停车位”。
不要恐慌!
一位名叫Adam Geitgey 的软件工程师、AI 软件工程博主也长期被“停车难”问题困扰。为了快速定位空车位,他利用实例分割模型Mask R-CNN和Python编写了一个抢占车位的小程序。
以下是作者第一人称给出的教程,欣赏一下。
我住在一个大城市,但像大多数城市一样,这里很难找到停车位。停车场总是爆满,即使你有自己的私人停车位,当朋友过来时也会因为找不到停车位而很麻烦。
我的解决方案是:
将相机拍摄到窗外,并使用深度学习算法让我的计算机在找到新停车位时发短信给我。
这听起来可能相当复杂,但使用深度学习构建这个应用程序实际上非常快速且简单。有各种现有的实用程序- 我们只需找到它们并将它们组合起来即可。
现在,让我们花几分钟时间使用Python和深度学习来构建一个高精度的停车位通知系统!
分解问题
当我们想通过机器学习解决一个复杂的问题时,第一步是将问题分解为一系列简单的任务。然后,对于每个简单的任务,我们可以从机器学习工具箱中找到不同的工具来解决它。
通过将这些简单问题的解决方案串成一个框架(例如下面的思维导图),我们将实现一个可以执行复杂操作的系统。
以下是我如何将检测公共停车位的问题分解为一个过程:
机器学习模型过程的输入是来自窗口的常规网络摄像头的视频:
我的相机拍摄的视频如上图所示
我们将每一帧视频输入到模型中,一次一帧。
该过程的第一步是检测视频帧中所有可能的停车位。显然,我们需要知道图像的哪些部分是停车位,以便检测哪些停车位是空的。
第二步是识别视频每一帧中的所有汽车,以便我们可以跟踪每辆车在帧之间的位移。
第三步是确定哪些停车位当前有汽车,哪些没有。这需要结合第一步和第二步的结果。
最后一步是当停车位可用时发送通知。这是基于视频帧之间汽车位置的变化。
我们可以使用多种技术以多种不同的方式完成这些步骤。构建流程没有单一的方法,也没有正确或错误的方法,但它们有不同的优点和缺点。现在我们来看看每一步!
检测图像中的停车位
以下是相机拍摄的图像:
我们需要能够扫描该图像并返回可以停车的区域列表,如下所示:
该街区有可用停车位
一种懒惰的方法是将每个停车位的位置手动编程到程序中,而不是自动检测停车位。但如果我们移动摄像头或者想要检测不同街道上的停车位,我们就必须再次手动输入停车位的位置。这很糟糕,所以让我们找到一种自动检测停车位的方法。
一个想法是寻找停车计时器并假设每个计时器旁边都有一个停车位:
图片中检测到停车计时器
但这种方法存在一定的问题。首先,并不是每个停车位都有停车计时器——事实上,我们最感兴趣的是找到一个免费停车位!其次,停车计时器的位置并不能告诉我们确切的停车位在哪里,它只能让我们更接近停车位。
另一个想法是构建一个对象检测模型,用于查找道路上绘制的停车位斜线标记,如下所示:
留意那些标记道路上每个停车位边界的黄色小标记。
但这种做法也是痛苦的。首先,我所在城市的停车斜线标记非常小,从远处很难看到,计算机也很难检测到。其次,街道上散布着各种不相关的线条和标记,因此很难区分哪些线是停车位,哪些是车道分隔线或人行横道。
每当你遇到一个看似困难的问题时,花几分钟看看是否可以避免一些技术困难并以不同的方式解决问题。停车位到底是什么?停车位是车辆长时间停留的地方。所以也许我们根本不需要检测停车位。为什么我们不能检测长时间静止的汽车并假设它们停在停车位上?
换句话说,真正的停车位只是容纳非移动车辆的区域:
这里每辆车的边界其实都是一个停车位!如果我们能够检测静止的汽车,我们就不需要实际检测停车位。
因此,如果我们能够检测汽车并找出视频的每一帧之间哪些汽车没有移动,我们就可以推断出停车位的位置。这变得很容易!
检测图像中的汽车
在视频的每一帧中检测汽车是一个标准的对象检测问题。我们可以使用许多机器学习方法来检测图像中的对象。以下是从过去到现在一些最常见的目标检测算法:
训练HOG(定向梯度直方图)对象检测器在我们的图像上滑动(扫描)以找到所有汽车。这种较旧的非深度学习方法运行速度相对较快,但它不能很好地处理朝不同方向行驶的汽车。训练CNN(卷积神经网络)目标检测器来读取(扫描)我们的图像,直到找到所有汽车。虽然这种方法很准确,但效率不高,因为我们必须使用CNN 算法多次扫描同一张图像才能找到其中的所有汽车。虽然它可以轻松找到面向不同方向的汽车,但它比基于HOG 的物体检测器需要更多的训练数据。使用更新的深度学习方法,如Mask R-CNN、Fast R-CNN 或YOLO,将CNN 的准确性与巧妙的设计和效率技巧相结合,可以大大加快检测过程。即使有大量训练数据来训练模型,这种方法也相对较快(在GPU 上)。一般来说,我们希望选择最简单的解决方案,用最少的训练数据完成工作,而不是最新、最华丽的算法。但在这种特殊情况下,Mask R-CNN 对我们来说是一个更合理的选择,尽管它相当花哨和时尚。
Mask R-CNN 架构的设计理念是在不使用滑动窗口方法的情况下,以计算有效的方式检测整个图像上的对象。换句话说,它运行得相当快。使用最新的GPU,我们可以每秒几帧的速度检测高分辨率视频中的对象。这对于这个项目来说应该没问题。
此外,Mask R-CNN 为每个检测到的物体提供了大量信息。大多数对象检测算法仅返回每个对象的边界。但Mask R-CNN不仅会给我们每个对象的位置,还会给我们一个对象轮廓(或概述),如下所示:
为了训练Mask R-CNN,我们需要大量包含我们想要检测的对象的图像。我们可以去拍摄汽车照片并检测这些照片中的所有汽车,但这需要几天的工作。幸运的是,汽车是许多人想要检测的常见物体,因此已经有相当多的汽车图像公共数据集。
流行的数据集之一称为COCO(上下文中的常见对象),其中包含带有注释的对象轮廓的图像。在此数据集中,有超过12,000 张带注释的汽车图像。下面是COCO数据集中的图片之一:
来自COCO 数据集的带有标记对象的图像。
该数据集非常适合训练Mask R-CNN模型。
等等,还有更好的东西!由于很多人使用COCO数据集来构建目标检测模型,因此许多人已经完成并分享了他们的结果。因此,我们可以从即插即用的预训练模型开始,而不是训练我们自己的模型。对于这个项目,我们将使用Matterport 的大型开源Mask R-CNN 实现,它带有预训练的模型。
旁注:不要害怕训练自定义Mask R-CNN 目标检测器!注释数据很耗时,但并不困难。
如果我们在相机捕获的图像上运行预训练的模型,我们将得到以下结果:
在我们的图像上,COCO 数据集中的默认对象被识别——汽车、人、交通灯和树。
我们不仅可以识别汽车,还可以识别红绿灯和人。幽默的是,其中一棵树被鉴定为“盆栽植物”。
对于图像中检测到的每个对象,我们将从Mask R-CNN 模型中获得以下四个数据:
1. 检测到的对象类型(以整数表示)。预训练的COCO 模型知道如何检测80 种不同的常见物体,例如汽车和卡车。以下是80 个常见对象的完整列表https://gist.github.com/ageitgey/b143ee809bf08e4927dd59bace44db0d。
2.目标检测的置信度得分。数字越高,模型正确识别对象的确定性就越高。
3. 图像中对象的边界框,以X/Y 像素位置表示。
4. 位图图层告诉我们边界框中的哪些像素是对象的一部分,哪些不是。从图层数据中,我们还可以计算出物体的轮廓。
以下是使用Matterport 的Mask R-CNN 和OpenCV 中预训练模型进行汽车边界框检测的Python 代码:
运行代码时,您将在图像上看到每辆检测到的汽车周围有一个边框,如下所示:
每辆检测到的汽车周围都有绿色边框。
您还可以在控制台中查看每辆检测到的汽车的像素坐标,如下所示:
在视频帧中找到的汽车:Car: [492 871 551 961]Car: [450 819 509 913]Car: [411 774 470 856]利用这些数据,我们已成功检测到图像中的汽车。您可以继续下一步!
检测空停车位
我们知道图像中每辆车的像素位置。通过连续观看多帧视频,我们可以轻松确定哪些车辆没有移动,并假设这些区域是停车位。但是我们如何检测汽车何时离开停车位呢?
主要问题是图像中汽车的边界框部分重叠:
即使对于不同停车位的汽车,每辆车的边界框也会有一点重叠。
因此,如果我们假设每个边界框代表一个停车位,那么即使停车位是空的,部分边界框也可能被汽车占用。我们需要一种方法来测量两个对象重叠的程度,以检查“大部分为空”的边界。
我们将使用交并并集(IoU) 方法。将两个对象重叠的像素数除以两个对象覆盖的像素总数,如下所示:
IoU 可以告诉我们汽车边界框与停车位边界框的重叠程度。通过这个指示器,我们可以轻松判断车位是否在车位上。如果IoU 测量值较低,例如0.15,则意味着汽车没有占用太多停车位。但如果测量值很高,比如0.6,这意味着汽车占据了大部分停车位,那么我们就可以确定停车位已被占用。
由于IoU 是计算机视觉中的常见指标,因此您使用的库通常已经有相关的实践。其实Matterport Mask R-CNN库中有这样一个函数mrcnn.utils.compute_overlaps(),我们可以直接调用这个函数。
假设您有一个代表图像中停车区域的边界框列表,那么检查检测到的车辆是否在这些边界框中就像添加一两行代码一样简单。
结果如下:
[ [1。 0.07040032 0. 0.] [0.07040032 1. 0.07673165 0.] [0. 0. 0.02332112 0.]] 在这个二维数组中,每一行代表停车位的边界框。相应地,每一列表示停车位与检测到的汽车重叠的程度。 1.0 分意味着汽车完全占据了停车位,而0.02 分则意味着汽车只触及停车位边界框但没有占据很多区域。
要找到空闲停车位,我们只需检查该数组中的每一行。如果所有数字都是零或非常小的数字,则意味着没有任何东西占用该空间,因此它是空闲的!
但请记住,对象检测并不总是适用于实时视频。尽管Mask R-CNN 非常准确,但偶尔它会错过一帧视频中的一两辆车。因此,在将停车位标记为空闲之前,我们应该确保它已经空闲了一段时间,可能是连续5 或10 帧视频。这将防止仅一帧视频上的临时对象检测问题误导系统判断停车位是空闲的。但当我们看到连续几帧视频图像中至少有一个车位被判断为空闲时,我们就可以发短信了!
发送短信
最后一步是,当我们注意到连续几帧视频图像中判定有车位空闲时,发送短信提醒。
使用Twilio 从Python 发送短信非常简单。 Twilio 是一个流行的界面,让您只需几行代码就可以从任何编程语言发送短信。当然,如果您更愿意使用其他短信提供商,也可以。我在Twilio 中没有股份。只是先想到了而已。
特维利奥:
https://www.twilio.com
要使用Twilio,您需要注册试用帐户、创建Twilio 电话号码并获取帐户凭据。然后,您需要安装Twilio Python 客户端的库:
pip3 install twilio安装完成后,使用以下代码(将关键信息替换为您的帐户信息)从Python发送短信:
from twilio.rest import Client # Twilio 帐户详细信息twilio_account_sid='此处为您的Twilio SID' twilio_auth_token='此处为您的Twilio 身份验证令牌' twilio_source_phone_number='此处为您的Twilio 电话号码' # 创建Twilio 客户端对象实例client=Client(twilio_account_sid, twilio_auth_token ) # 发送短信=client.messages.create( body='This is my SMS message!', from_=twilio_source_phone_number, to='Destinationphone number here' ) 直接将代码插入到我们的脚本中,就可以添加函数现在可以使用发送短信的功能。但我们需要注意的是,如果停车位始终是空闲的,则无需在视频的每一帧中都给自己发送短信。因此,我们需要有一个标志来标记我们是否已经发送了一条短信,并确保在经过一定时间或检测到另一个停车位空闲之前我们不会发送另一条短信。
包装和组装
我们将流程中的每个步骤编写为单独的Python 脚本。这是完整的代码:
这部分代码太长,有兴趣的同学可以在以下网址找到:
https://medium.com/@ageitgey/snagging-parking-spaces-with-mask-r-cnn-and-python-955f2231c400
要运行此代码,您需要首先安装Python 3.6+、Matterport Mask R-CNN 和OpenCV。
Matterport Mask R-CNN:
https://github.com/matterport/Mask_RCNN
开放式CV:
https://pypi.org/project/opencv-python/
我有意使代码尽可能简洁。例如,它只是假设视频第一帧中出现的任何汽车都是停放的汽车。尝试修改代码,看看是否可以提高其可靠性。
不用担心修改此代码以适应不同的场景。只需更改模型搜索的对象ID 即可将代码完全转换为其他内容。例如,假设您在滑雪场工作。通过一些调整,您可以将此脚本转换为一个系统,自动检测滑雪跳台离开斜坡并记录酷炫的跳台滑雪轨迹。或者,如果您在野生动物保护区工作,您可以将此脚本转换为一个系统,用于计算您在野外看到的斑马数量。
唯一的限制是你的想象力。
我们一起来尝试一下吧!
相关报道:
https://medium.com/@ageitgey/snagging-parking-spaces-with-mask-r-cnn-and-python-955f2231c400
用户评论
终于找到解决停车难这个难题的方法了!这篇文章写的很棒,图文并茂,讲解很详细,我已经开始尝试跟着步骤进行操作了。希望以后能够在实际项目中运用起来。
有12位网友表示赞同!
开车每次路过小区门口都要眼巴巴看着别人占着好车位,真是太郁闷了!这篇博客太棒了!Mask RCNN和Python结合,打造抢车位神器听起来很酷炫,一定要试试看!
有19位网友表示赞同!
感觉这个项目很有实用价值,尤其是在城市停车资源越来越紧张的情况下。文章讲解非常清晰,即使我比较菜鸟也能理解。期待看到作者后续分享更多关于该工具的应用场景和改进建议。
有5位网友表示赞同!
这篇文章内容太酷了! 用Mask RCNN来做车位检测,真是脑洞大开!不过对于我这种对机器学习完全没概念的人来说,步骤还是有点看不懂。
有20位网友表示赞同!
这个“抢车位神器”的实用性真让人怀疑啊!虽然技术很厉害,但我担心这会带来严重的道德和法律问题。如果滥用这样的工具,后果不堪设想!
有5位网友表示赞同!
学习Python和机器学习本来就挺难的了,这篇博客讲解还涉及到Mask RCNN这个比较复杂的模型,我感觉可能不太适合新手小白入门... 不过还是要感谢作者分享这种创意十足的项目经验!
有5位网友表示赞同!
哈哈,停车位总是这么紧张!文章说的很有道理,用技术解决难题,这才是聪明的方法! 这就好像是在玩游戏一样,只不过是真实的世界版车位大战,太有意思了!
有14位网友表示赞同!
作者是不是有点太乐观了?Mask RCNN虽然很厉害,但实际应用会遇到很多实际问题。比如,摄像头视野有限,环境变化多端,这些都不能保证模型的准确率… 可能还需要进一步完善算法才能达到“抢车位神器”的效果
有9位网友表示赞同!
我一直觉得汽车座位的自动定位功能已经够先进的了,现在还要用技术来抢停车位?感觉有点过度发展科技...
有12位网友表示赞同!
这篇文章确实让我对Mask RCNN有了更深的了解!它不仅可以用于车位检测,还有很多其他的应用场景,比如目标识别、图像分割等等。我会继续学习这个模型,看看能不能在一些实际项目中运用到!
有13位网友表示赞同!
这个想法很有趣,但我还是比较担心技术落后导致的结果。如果所有人都使用这种“抢车位神器”,难免会造成更多交通拥堵和资源冲突问题。
有10位网友表示赞同!
写的挺好的!我虽然不是程序员,但是对人工智能领域很感兴趣。文章讲解简单易懂,让我对 Mask RCNN 有一定的了解。期待作者以后能分享更多关于人工智能的知识!
有11位网友表示赞同!
如果真的可以在停车位上搞个摄像头?会不会侵犯隐私啊?
有13位网友表示赞同!
这篇文章打开了我的眼界!没想到车位也能利用机器学习来解决,这种新技术真是太令人兴奋了! 希望能有一天能够在生活中使用到这样的工具。
有17位网友表示赞同!