6个步骤,告诉你如何用树莓派和机器学习DIY一个车牌辨认器!(附详细分析)
作者头像
  • 许钦说智能
  • 2020-03-08 12:29:23 7

几个月前,作者萌生了一个让汽车能够检测和识别物体的想法。他对此非常感兴趣,因为已经见识到了特斯拉的出色表现,尽管暂时无法购买特斯拉(Model 3似乎越来越吸引人),但他决心实现自己的梦想。

作者记录了项目的每一个步骤。首先,他明确了项目的范围。他认为从小做起总是最好的策略:一步一步来。因此,除了车道保持辅助功能外,他的主要目标是清晰地识别车牌。这个识别过程分为两个步骤:检测车牌和识别车牌框内的文本。

如果能做到这一点,那么进行其他操作应该会相对容易,例如评估碰撞风险、距离等。甚至可以构建一个环境的矢量空间表示,这是一个不错的选择。

在深入了解细节之前,我们需要了解两件事情:一种能够将未标记图像作为输入并检测车牌的机器学习模型,以及某种硬件。简而言之,需要一个能够连接到一个或多个摄像头的计算机系统来运行模型。

首先,作者着手构建合适的对象检测模型。经过仔细研究,他决定采用以下机器学习模型:YOLOv3——这是迄今为止最快的模型,其mAP性能与其他高级模型相当,主要用于检测物体。文字检测器——用于检测图像中的文字。CRNN——这是一种循环卷积神经网络(CNN)模型,因为需要能够按照正确的顺序排列检测到的字符,形成单词。

这三个模型将如何协同工作呢?以下是操作流程:首先,YOLOv3模型在每一帧中检测车牌的边界框。建议不要过于精确地预测边界框,包含比检测到的物体更宽的边界框会更好。如果太窄,则可能会影响后续流程的性能。接下来,CRAFT文字检测器从YOLOv3接收裁剪的车牌。如果裁剪后的帧太窄,可能会遗漏部分车牌文字,从而导致预测失败。然而,当边界框更大时,CRAFT模型可以更准确地检测字母的位置。最后,将CRAFT中每个单词的边界框传递给CRNN模型,以预测实际的单词。

有了基本的模型架构后,作者开始考虑硬件设计。他需要低功耗的硬件,例如树莓派(Raspberry Pi)。它具备足够的计算能力,能够以可观的帧速率对帧进行预处理,并且配备了Pi摄像头。Pi摄像头是树莓派的实际相机系统,有一个很棒的库,且非常成熟。

为了联网访问,作者选择了EC25-E的4G接入,并嵌入了一个GPS模块。关于树莓派接入4G网络的文章可以在这里阅读:

https://www.robertlucian.com/2018/08/29/mobile-network-access-rpi/

作者设计了一个支撑结构,将树莓派、GPS模块和4G模块挂在汽车的后视镜上。这些结构使用可靠的Prusa i3 MK3S 3D打印机打印而成。通过调整后视镜支架,读者可以很容易地在汽车上安装这套装置。

在硬件设计完成后,作者开始训练模型。他决定尽量利用现有的工作成果,避免重复造轮子。因此,他采用了迁移学习的方法,利用其他大型数据集的分析成果。作者找到了一个关于迁移学习的案例,讲述了哈佛医学院的一个团队如何利用预训练模型预测“从胸部X光片得出的长期死亡率”,其中包括非癌性死亡。他们只用了50000张标签图像,但预训练模型(Inception-v4)已经在大约1400万张图像上进行了训练。这种方法不仅节省了时间和金钱,而且准确性仍然很高。

作者在网上找到了一些已经训练过的车牌检测模型,虽然数量不多,但其中一个模型使用Darknet的预训练模型训练了大约3600张车牌图像。作者用VOTT标注了收集的车辆图像,并创建了一个包含534张图像的小型数据集。数据集链接如下:

https://github.com/RobertLucian/license-plate-dataset

接着,作者找到了YOLOv3网络的Keras实现,并用它来训练数据集。最终,模型在测试集上的mAP达到了90%,考虑到数据集很小,这是一个不错的结果。

在文本识别方面,作者找到了一个名为keras-ocr的包,它包含了CRAFT和CRNN的实现及其预训练模型。作者决定不对模型进行微调,直接使用预训练模型。使用keras-ocr预测文本非常简单,只需要几行代码。

接下来,作者部署了车牌识别模型。有两种主要的部署方法:在本地进行所有推理,或在云端进行推理。这两种方法都有挑战。第一个方法需要一个庞大的计算系统,既复杂又昂贵。第二个方法涉及延迟和基础设施方面的挑战,特别是在使用GPU进行推理时。

在研究过程中,作者偶然发现了一个名为cortex的开源项目。cortex是一个将机器学习模型部署为生产级Web服务的平台。这意味着可以专注于应用程序本身,而将其他事情交给cortex处理。在这种情况下,cortex在AWS上完成了所有配置,唯一需要做的事情就是编写模板模型的预测器。

通过cortex处理部署后,作者继续设计客户端。客户端面临的挑战是如何以适当的方式处理图像流。具体架构如下:以适当的分辨率(800x450或480x270)从Pi相机以30 FPS的速度采集帧,并将每个帧放入公共队列。在一个单独的进程中,从队列中拉出帧并分发给多个工作线程。每个工作线程向cortex API发出请求,先向yolov3 API发送请求,如果检测到车牌,则向crnn API发送请求,其中包含裁剪的车牌图像。响应包含文本格式的车牌号预测。每个检测到的车牌(包含或不包含识别的文本)推入另一个队列,最终广播到阅读器页面。同时,车牌号预测推送到另一个队列,稍后保存到磁盘(CSV格式)。

为了克服4G带宽的限制,作者采取了一些技巧:将图像宽度减小到416像素,转换为灰度图像,并删除图像顶部的45%部分。再次将图像转换为JPEG,但质量较低。最终帧的大小约为7-10KB,这非常好。推理API所需的带宽约为6Mb/s,这是可以接受的。

经过观看视频得知,该项目取得了成功。视频地址为:https://youtu.be/gsYEZtecXlA。在cortex的实时演示中,作者大约需要20个配备GPU的实例才能顺利运行。根据集群的延迟,可能需要更多或更少的实例。从捕获帧到广播到阅读器窗口的平均等待时间为0.9秒,考虑到推断发生在很远的地方,这非常令人满意。

虽然文本识别部分不是最佳,但至少证明了这一点。通过提高视频分辨率、缩小摄像机视场或进行微调,可以提高精度。作者认为,通过优化可以减少所需GPU的数量。例如,将模型转换为使用混合精度(FP16/BFP16)可以显著提高效率。在T4和V100 GPU上,半精度加速比单精度快8-10倍。这意味着转换为使用半精度类型可以大大减少推断时间。作者没有将模型转换为使用半精度,因为这超出了项目的范围。不过,作者可能会在未来的版本中使用它。

总而言之,通过一系列优化,将集群的大小从20个配备GPU的实例减少到一个实例是可行的。适当的优化甚至可以将单个GPU实例的性能最大化。为了降低成本,在AWS上使用弹性推理可以将成本降低多达75%。随着5G网络的普及,计算受限的边缘设备将更加依赖云计算。未来,更多的计算任务可以卸载到云端,这将使得部署更高效和经济。

【end】

    本文来源:图灵汇
责任编辑: : 许钦说智能
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
树莓何用车牌辨认步骤机器告诉分析学习详细
    下一篇