如何使用Mask-RCNN检测停车位可用性?
![](https://filescdn.proginn.com/0e8ed6ea8c70056e671f0f291cc18d00/e83b568bb2212c7da60f10afb5819390.webp)
空/占用停车位
我最近做了一个项目,根据安全摄像头的照片来检测停车位是否可用或被占用。我的工作有局限性,我将进一步详细介绍这些局限性,但一旦这些问题得到解决,这个项目可能是一个低成本的解决方案,以优化停车位的可用性。安装这些额外的设备肯定是有潜力的。让我详细说明我在这个项目中使用的资源。Kaggle上有一个停车场数据集,无论位置是否被占用,它都有足够的数据点来训练一个深度学习模型和xml文件,我们可以在这里访问数据集停车场数据集。对于模型,我使用了最先进的目标检测和分割Mask-RCNN模型,它的性能惊人,可以通过这个链接访问。如我们所见,Mask-RCNN在COCO数据集模型上进行了直接即用的预训练,在目标检测和分割方面做得很好。尽管在某些情况下,它把汽车误分为火车和卡车。![](https://filescdn.proginn.com/b2f7a93e2edb04edf872cf8b1d3ac21c/9013cc3f9ada9ea99ec3599618f0cd91.webp)
Mask-RCNN对象检测和分割
我也尝试了YOLO-v3,它的性能是一样的,所以我没有进一步使用YOLO模型,但如果小伙伴正在寻找替代的模型,YOLO是一个很棒的对象检测模型,这里有链接。![](https://filescdn.proginn.com/57ec61d28af1e47962abd93609ceec7c/b50081c9e8e16f35faca52f28e4cb695.webp)
YOLO模型检测停车场上的车辆
首先我使用Mask-RCNN模型来检测车位上的车辆,并给定可用车位的数量来计算空车位。我们的模型不需要所有的COCO类,所以我将类限制为汽车、卡车和摩托车。但是预先训练的COCO数据集模型在检测小物体方面做得并不好,即使我尝试调整阈值和边界框,那些被误分类为火车的汽车也没有被检测到。这里绘制的是边界框,而不是可视化方法提供的模型。![](https://filescdn.proginn.com/f632706b84689ce5918d81777bf5b21b/0f39b7797222f30b99d1652ed4f1d76a.webp)
Mask-RCNN模型预测
基于数据集的预测,这样我们就有两个类来预测这个位置是被占用了还是空了。这个停车场数据集的不足之处是,只从两个角度拍摄照片,这导致训练模型时存在过拟合问题,没有很好的泛化能力。其次,每个车位的标注不完整,在训练过程中会产生异常,并且并不是所有照片上可用的车位都被标注了,这也导致了模型的性能较差。我将向小伙伴展示我的意思,下面的照片只是显示了有多少停车位被注释:![](https://filescdn.proginn.com/832b6e7b0ea3f71a654100731611cc42/8f004d2b2f3102611874989bcd38bf43.webp)
并非所有停车位都已标注
![](https://filescdn.proginn.com/f776b18cfe3503960803fdd2841fce3a/8df804a5c5f7f6d252523491c057cdbb.webp)
![](https://filescdn.proginn.com/23768993ef501697f15d5b5807054c9c/c85bfdb598f1007ead3aea6670c98ea1.webp)
注释文件中缺少信息
缺少信息的停车位数量可能会增加到10-15个停车位,但在运行一些代码后,我认为这可以手动修复:有太多的文件需要修复,只为了训练模型的顶层,避免这些文件比较容易。为了解析xml文件,我使用了内置的python包XML .etree.Elementtree。同样值得注意的是,边界框的坐标是以一个中心点的角度给出的,所以如果我们想要正确地解析和创建边界框,就必须进行一些调整。
![](https://filescdn.proginn.com/cc9109bee8cadaac955eaac8eb4da25a/99650ec84578556760e938a3ab6250d0.webp)
![](https://filescdn.proginn.com/5700b05cf53c985d1f7e12f9a72eca78/2443f1fca5db8f3971686ef4b610c135.webp)
函数解析xml文件,提取停车位的轮廓
由于Mask-RCNN使用掩码来训练类,采用与KangarooDetection文章类似的方式,可以在这里访问,我使用边界框来创建掩码。这篇文章实际上帮助我们理解了如何使用Mask-RCNN模型,并且机器学习掌握对于许多机器学习应用程序来说是一个很好的资源。如果小伙伴还没看过的话,可以浏览一下。主要的区别是,我们将检测两个类,而不是一个,从而创建基于占用分类的掩码,以及如何计算边界框。![](https://filescdn.proginn.com/6e48efc7127ac323373abdbe574f7660/34edc816bde5d9fde84e70e44b496b1a.webp)
函数在边界框之外创建掩码,并创建两个要检测的类
至于数据集结构,我们必须为训练和测试数据创建两个目录,每个包含图像文件夹和匹配的标签文件夹,其中每个xml文件除了扩展名不同之外,都具有相同的文件名。而其余部分实际上是遵循一般的做法来训练Mask-RCNN的顶层,小伙伴可以在Matterport GitHub上查看不同的示例代码。我们必须创建一个类ParkingLot来加载数据集,通过解析带注释的xml文件提取边界框的轮廓。![](https://filescdn.proginn.com/8e7a80147a282278590bd22a85612e17/11718d403f6b23de3fa337dbe510540b.webp)
创建停车场类
然后,我们需要指定配置类,基于我们希望模型训练的类,加载训练和测试数据集,使用“训练”模式加载模型,并开始训练。![](https://filescdn.proginn.com/379d71ecab8f77d6463c93200af1d917/904c6bac9c944addc530cc3d0ee8e0c4.webp)
停车配置类
模型将在每个时期后保存在日志文件夹中,以便在训练完成后,我们可以继续加载模型以评估其性能。使用Mask-RCNN实现这一点的方法是创建新的配置类,该类将限制我们的预测范围。![](https://filescdn.proginn.com/2a4c8d3a2aeceeb9afbb178bbb8262a9/ae28264e4c517b30d2ac39e2c4b4757c.webp)
预测配置类
用“验证集”模式加载模型,从logs文件夹加载模型:
![](https://filescdn.proginn.com/9b97f34df07242430e1a5b63b7129d47/22423ea1196f9f2306a4cf500520f5a6.webp)
![](https://filescdn.proginn.com/5dcc9d45ce3a5e045805f495f891252c/7348a9dfc3fbf92f5cbc82348ab4e164.webp)
函数绘制检测对象的边界框
因此,如果我们加载任意随机图像,检测可用和已占用的停车位,使用我们的函数来绘制它们,结果将是:![](https://filescdn.proginn.com/36d126ce086735660fcc2a9e1d6a403e/5e64dfe239c6883809f53ccc840ecfe3.webp)
绿色框是可用的停车位,蓝色边界框是已占用的停车位。这个模型的性能看起来是相当不错,尽管它仍然不能检测到小车/停车位。数据集中故意忽略了停在人行道旁的汽车,这样模型在训练时就不会考虑这些汽车。这是MaskRCNN可视化方法的结果:
![](https://filescdn.proginn.com/55befa42222703fb7b6be10cb24ab6a0/76363ddc7db974f1892921f0c7baed46.webp)
Mask-RCNN检测可用停车位
考虑到这个结果,似乎模型的性能真的很好。但在我们的数据集中,我们只有停车场的两个角度,因为我只训练顶级模型,我只使用了数据集的一部分。所以,可以看一下另一张停车场的照片,用类似的摄像头定位,但不是这个数据集的一部分。![](https://filescdn.proginn.com/96a6c5f7cfe2292b4ee2ea6c3828982f/16f31440e7eb683df9a1495ebf293444.webp)
![](https://filescdn.proginn.com/70151716c22e6d35afa0383ee92317df/54c3fa438493121a49a99eda97785179.webp)
![](https://filescdn.proginn.com/2fcdf1fa6cd2cbfc8b662ce999756767/52e9fd30b0a450ec5144f1c1ef2d4cc9.webp)
很明显,这个模型与我们的停车场数据集过于匹配,这意味着它在同一个数据集上表现很好,但我没有说训练,因为训练和测试照片实际上是位于停车场上不同汽车的相同照片,虽然技术上没有泄漏测试数据,但在某种意义上,他们是一样的。预先训练过的、开箱即用的Mask-RCNN在探测车辆方面的表现要好得多。
鉴于这些结论和我之前提到的局限性,为了改进模型或向前推进,下一步应该做什么?我们可以使用整个数据集从头开始训练模型,看看它的执行情况,尝试调优检测阈值。我们也可以试着去做,也许这可以成为这篇文章的第二部分。但理想情况下,更多变化的数据集是必不可少的,完整的注释是创建准确的停车位检测模型的基础。此外,为了建立不仅准确而且健壮的检测模型,考虑到正在行驶而尚未停车的汽车和擅自停放的汽车是非常重要的,这些可能是未来需要进一步研究的步骤。