摘要:一个小例子带你玩转 Opencv+tensorflow~
介绍
你是不是经常在停车场周围转来转去寻找停车位。如果你的手机能准确地告诉你最近的停车位在哪里,那是不是很爽?事实证明,基于深度学习和 OpenCV 解决这个问题相对容易,只需获取停车场的实时视频即可。下面的 GIF 图片突出显示洛杉矶机场停车场上所有可用的停车位,并显示可用停车位的数量,关键是这一过程是实时的!
你可以在 Github repo 找到我曾用过的代码。
步骤概述
构建这个停车检测模型主要有两个步骤:
1. 检测所有可用的停车位;
2. 确定停车位是空的还是被占用的;
因为安装了摄像头视图,我们可以使用 OpenCV 对每个停车位进行一次映射。一旦你知道了每个停车位的位置,你就可以用深度学习来预测它是否空着。我已经在我的博客上分享了所涉及的一个高层次步骤的概述。如果你对详细代码感兴趣,请看看我的博客。
检测所有可用停车位的位置
检测停车位的基本思路是,所有的停车点的分隔线都是处于水平线,而一列中的停车点之间的间隔大致相等。首先使用 Canny 边缘检测来获得边缘图像。我还把没有停车的地方遮了起来。如下所示:
然后我在边缘图像上做了霍夫变换,画出了它能识别的所有线。我只选择斜率接近于零的直线来隔离水平线。霍夫变换的输出如下:
正如你所看到的那样,霍夫变换在识别停车线方面做得相当好,但是输出有噪声——几个停车线被多次检测到,而有些被遗漏了。那么我们如何解决这个问题呢? 然后我用观察和直觉开始,通过使用霍夫变换返回的坐标,聚集 x 坐标来确定主要的停车道。利用聚类逻辑来识别车道线 x 坐标的间隔。这样就能识别出这里的 12 个车道。如下:
如果所有这些看起来都很复杂,别担心 5——我已经在 github 的 jupyter notebook 上一步一步地记录了代码。现在我已经知道了所有的停车道都在哪里,通过合理地假设所有的停车点大小都一样来识别每个单独的停车位。我仔细观察了结果,以确保尽可能准确地捕捉到点之间的边界。我终于能够标出每个停车位。如下:
当完成了每个车位的定位之后,我们可以为每个点分配一个 ID,并将其坐标保存在字典中并将它 pickled 了一下,以便以后能取回。这是可以实现的,因为安装了摄像头,我们不需要一次又一次地计算每个点在视图中的位置。更多详情请登录我的博客。
识别该车位是否有标记
现在我们有了每个停车位的映射,可以通过以下几种方式来确定这个停车位是否被占用:
1. 使用 OpenCV 检查视频图像中停车位的像素颜色是否与空停车位的颜色一致。这是一种简单的方法,但容易出错。例如,灯光的变化将会改变一个空停车位的颜色,在一天的光照变化中,这种方法将无法正确工作。如果有可能的话,这种逻辑会把灰色的汽车当成空停车位;
2. 使用目标检测来识别所有的汽车,然后检查汽车的位置是否与停车位重叠。我做了尝试,发现实时检测模型真的很难检测小尺寸的对象,检测到的车辆不超过 30%;
3. 使用 CNN 检测每个停车位,并预测是否有人停车,这种方法最终效果最好。
要构建一个 CNN,我们需要停车位有车以及无车这两种情况的图像。我提取了每个停车位的图像,并将其保存在文件夹中,然后将这些图像分组。我还在 Github 上分享了这个训练文件夹。
因为在 1280×720 像素的图像中有近 550 个车位,所以每个车位的大小只有 15×60 像素左右。下面是空车位和被占用车位的图像:
然而,由于被占用车位和空车位看起来有很大的不同,这对 CNN 来说应该不是一个具有挑战性的问题。
然而,我只有大约 550 张关于这两个类的图片,所以决定利用 VGG 的前 10 层,并在 VGG 模型的输出添加一个单一的 softmax 图层来进行迁移学习。你可以在这里找到这个迁移学习模型的代码,准确率达到 94%。见下文:
现在,我将停车位检测和 CNN 预测器结合起来,构建了一个停车位检测器,准确率非常高。
我还在 notebook 记录了在视频流上运行这个的代码。
结论
对于联合不同的工具和使用深度学习来构建实际应用程序这么容易我感到很惊奇,我在两个下午完成了这项工作。
准备进一步探索的其他几个想法:
1. 如果可以将车位检测逻辑扩展到任何可能使用深度学习的车位地图上,那就太好了,OpenCV 对每个用例进行调优有限制;
2.CNN 使用的 VGG 模型是一个重量化模型,想要尝试更轻量化的模型。
云服务器 99 元拼团购!拉新还可赢现金红包!300 万等你瓜分!马上一键开团赢红包:http://click.aliyun.com/m/1000019899/
本文作者:【方向】阅读原文
本文为云栖社区原创内容,未经允许不得转载。