点击上方 "码农真经" 关注,星标或者置顶

22点24分准时推送,第一时间送达

来源:机器之心 | 编辑:真经君

特斯拉自动识别车辆(你有特斯拉我有树莓派纯手工打造车载车牌识别检测系统秒变智能车)(1)

码农真经(ID:coder_experience)第 113 次推文 图源:百度

上一篇:Python3.9又更新了:dict内置新功能,正式版十月见面

正文

闲来无事,我们给爱车装了树莓派,配了摄像头、设计了客户端,搞定了实时车牌检测与识别系统。

怎样在不换车的前提下打造一个智能车系统呢?一段时间以来,本文作者 Robert Lucian Chiriac 一直在思考让车拥有探测和识别物体的能力。这个想法非常有意思,因为我们已经见识过特斯拉的能力,虽然没法马上买一辆特斯拉(不得不提一下,Model 3 现在看起来越来越有吸引力了),但他有了一个主意,可以努力实现这一梦想。

所以,作者用树莓派做到了,它放到车上可以实时检测车牌。

特斯拉自动识别车辆(你有特斯拉我有树莓派纯手工打造车载车牌识别检测系统秒变智能车)(2)

特斯拉自动识别车辆(你有特斯拉我有树莓派纯手工打造车载车牌识别检测系统秒变智能车)(3)

放一张成品图镇楼。第一步:确定项目范围开始之前,我脑海里出现的第一个问题是这样一个系统应该能够做到什么。如果说我活到现在学到了什么,那就是循序渐进——从小处着手永远是最好的策略。所以,除了基本的视觉任务,我需要的只是在开车时能清楚地识别车牌。这个识别过程包括两个步骤:

特斯拉自动识别车辆(你有特斯拉我有树莓派纯手工打造车载车牌识别检测系统秒变智能车)(4)

图 1 :树莓派 4G/GPS 壳的外形

特斯拉自动识别车辆(你有特斯拉我有树莓派纯手工打造车载车牌识别检测系统秒变智能车)(5)

图 2:利用球关节活动臂支撑 Pi Camera图 1 和图 2 就是它们渲染时候的样子。注意这里的 c 型支架是可插拔的,所以树莓派的附件和 Pi Camera 的支撑物没有和支架一起打印出来。他们共享一个插座,插座上插着支架。如果某位读者想要复现这个项目,这是非常有用的。他们只需要调整后视镜上的支架就可以了。目前,这个底座在我的车(路虎 Freelander)上工作得很好。

特斯拉自动识别车辆(你有特斯拉我有树莓派纯手工打造车载车牌识别检测系统秒变智能车)(6)

图 3:Pi Camera 支撑结构的侧视图

特斯拉自动识别车辆(你有特斯拉我有树莓派纯手工打造车载车牌识别检测系统秒变智能车)(7)

图 4:Pi Camera 支撑结构和 RPi 底座的正视图

特斯拉自动识别车辆(你有特斯拉我有树莓派纯手工打造车载车牌识别检测系统秒变智能车)(8)

图 5:预计的相机视野

特斯拉自动识别车辆(你有特斯拉我有树莓派纯手工打造车载车牌识别检测系统秒变智能车)(9)

图 6:内置 4G/GPS 模块、Pi Camera,树莓派的嵌入式系统近照显然,这些东西需要一些时间来建模,我需要做几次才能得到坚固的结构。我使用的 PETG 材料每层高度为 200 微米。PETG 在 80-90 摄氏度下可以很好地工作,并且对紫外线辐射的抵抗力很强——虽然没有 ASA 好,但是也很强。这是在 SolidWorks 中设计的,所以我所有的 SLDPRT/SLDASM 文件以及所有的 STLs 和 gcode 都可以在原文末找到。你也可以用这些东西来打印你自己的版本。第四步:训练模型既然硬件解决了,就该开始训练模型了。大家应该都知道,尽可能站在巨人的肩膀上工作。这就是迁移学习的核心内容了——先用非常大的数据集来学习,然后再利用这里面学到的知识。YOLOv3我在网上找了很多预先训练过的车牌模型,并没有我最初预期的那么多,但我找到了一个在 3600 张车牌图上训练过的。这个训练集并不大,但也比什么都没有强。除此之外,它也是在 Darknet 的预训练模型的基础上进行训练的,所以我可以直接用。模型地址:github.com/ThorPham/License-plate-detection因为我已经有了一个可以记录的硬件系统,所以我决定用我的系统在镇上转上几个小时,收集新的视频帧数据来对前面的模型进行微调。我使用 VOTT 来对那些含有车牌的帧进行标注,最终创建了一个包含 534 张图像的小数据集,这些图像中的车牌都有标记好的边界框。数据集地址:https://github.com/RobertLucian/license-plate-dataset然后我又找到利用 Keras 实现 YOLOv3 网络的代码,并用它来训练我的数据集,然后将我的模型提交到这个 repo,这样别人也能用它。我最终在测试集上得到的 mAP 是 90%,考虑到我的数据集非常小,这个结果已经很好了。

特斯拉自动识别车辆(你有特斯拉我有树莓派纯手工打造车载车牌识别检测系统秒变智能车)(10)

因为这个计算机视觉系统不是为了实现自动驾驶而设计的,所以延迟对我来说不那么重要,我可以用 cortex 来解决这个问题。如果它是自动驾驶系统的一部分,那么使用云提供商提供的服务就不是一个好主意,至少现在不是。部署带有 cortex 的 ML 模型只需:

特斯拉自动识别车辆(你有特斯拉我有树莓派纯手工打造车载车牌识别检测系统秒变智能车)(11)

图 7:基于 cortex 提供的云 api 与客户端流程图在我们的例子中,客户端是树莓派,推理请求发送到的云 api 由 AWS 上的 cortex 提供。客户端的源代码也可以在其 GitHub 中找到:github.com/robertlucian/cortex-licens-plate-reader-client我必须克服的一个挑战是 4G 的带宽。最好减少此应用程序所需的带宽,以减少可能的 hangups 或对可用数据的过度使用。我决定让 Pi Camera 使用一个非常低的分辨率:480x270(我们这里可以用一个小分辨率,因为 Pi Camera 的视野非常窄,所以我们仍然可以很容易地识别车牌)。不过,即使是在这个分辨率下,每一帧的 JPEG 大小也是大约 100KB(0.8MBits)。乘以每秒 30 帧就得到 3000KB,也就是 24mb /s,这还是在没有 HTTP 开销的情况下,这是很多的。因此,我用了一些小技巧:

上面这个是通过 cortex 进行实时推理的例子。我需要大约 20 个装备了 gpu 的实例才能顺畅地运行它。根据这一组 gpu 的延迟,你可能需要更多的 gpu 或是更少的实例。从捕获帧到向浏览器窗口广播帧之间的平均延迟约为 0.9 秒,考虑到推断发生在很远的地方,这真是太神奇了——到现在我还是觉得惊讶。文本识别部分可能不是最好的,但它至少证明了一点——它可以通过增加视频的分辨率或通过减少摄像机的视场或通过微调来更精确。至于 GPU 需求数太高的问题,这可以通过优化来解决。例如,在模型中使用混合精度/全半精度 (FP16/BFP16)。一般来说,让模型使用混合精度对精度的影响很小,所以我们并没有做太多的权衡。总而言之,如果所有的优化都到位,那么将 gpu 的数量从 20 个减少到一个实际上是可行的。如果进行了适当的优化,甚至一个 gpu 的资源都用不完。原文地址:towardsdatascience.com/i-built-a-diy-license-plate-reader-with-a-raspberry-pi-and-machine-learning-7e428d3c7401

--END--

往日热文:

实时可视化Debug:VS Code 开源新工具,一键解析代码结构

科技部正式发文:破除“唯论文”不良导向;网友:靠水论文拿奖励的人不开心了

5个原因告诉你,为什么说Julia比Python要好?

我用Python远程探查室友每天的网页访问记录,他不愧是成年人!

Python高效编程技巧,看了都说好!

喜欢本文的朋友们,欢迎长按下图关注订阅号码农真经

收看更多精彩内容

你在看吗?一起成长

,