全文共7733字,预计学习时长23分钟
来源:Pexels
几个月前,笔者有一些想法,想让自己的车能检测和识别物体。笔者之所以有如此想法,主要是因为已经见识了特斯拉的能力,虽然并不想马上买一辆特斯拉(不得不说,Model 3看起来一天比一天诱人),但笔者认为应该尝试实现自己的梦想。
所以,笔者实施了这个想法。
动图来自结果的预测视频。
下文记录了项目中的每个步骤。如果只想看到检测器运行的视频或者GitHub链接,请跳到底部。
第一步,确定项目范围
起初,笔者思考了这样一个系统应该有什么能力。如果说笔者这辈子学到了什么,那就是从小范围开始永远是最好的策略:小步走。所以,除了车道保持任务(每个人都已经做过),笔者只是想在驾驶时简单地识别车牌。此识别过程包括两个步骤:
1、检测车牌。
2、识别每个车牌边框内的文字。
笔者认为,如果能做到这一点,那么继续进行其他任务应该是相当容易的(比如确定碰撞风险、距离等)。甚至可以创建一个向量空间来表示环境,这就十分炫酷了。
在过于担心细节之前,笔者需要:
· 一个机器学习模型,将未标记图像作为输入并检测车牌。
· 一些硬件。粗略地说,需要一个连接到一个或多个摄像机的计算机系统来查询模型。
首先着手构建对象检测的正确模型。
第二步,选择正确模型
经过仔细研究,决定采用以下机器学习模型:
1. YOLOv3——这是迄今为止速度最快的模型,具有可与其他先进模型相媲美的映射。这个模型是用来检测对象的。
2. CRAFT文本检测器——用于检测图像中的文本。
3. CRNN ——一个循环的CNN(卷积神经网络)模型。它必须进行循环,因为它需要将检测到的字符按正确的顺序组成单词。
这三个模型如何协同?操作流程如下:
1. 首先,YOLOv3模型在摄像头接收到的每一帧中检测每个车牌的边框。不建议预测的边框非常精确,超过检测到的对象的范围较为合适。如果范围太狭窄,那么可能会影响后续进程的性能。这与下面的模型是并行不悖的。
2. CRAFT文本检测器从YOLOv3接收裁剪后的车牌。如果裁剪的帧太狭窄,那么很有可能会漏掉车牌的部分文字,导致预测失败。但当边框较大时,可以让CRAFT模型检测字的位置。这可以非常精确地预测每个字的位置。
3. 最后,可以将CRAFT中每个单词的边框输入CRNN模型来预测实际单词。
有了基本的模型架构,接下来可以解决硬件了。
第三步,设计硬件
当笔者知道自己需要一些简单的东西时,便想起了旧爱:树莓派。它有足够的计算能力来用合适的帧数对帧进行预处理,它也有Pi Camera。Pi Camera是树莓派的摄像机系统。它有一个非常棒的存储库,而且非常成熟。
至于互联网接入,可以只用一个EC25-E来实现4G接入,也有来自笔者曾经的项目的一个GPS模块嵌入。
笔者决定从外壳开始。把它挂在汽车的后视镜上应该会很好用,所以最后设计了一个双组件支撑结构:
1. 后视镜一侧,树莓派+GPS模块+4G模块。可以查看笔者关于EC25-E模块的文章,看看笔者对GPS和4G天线的选择。
2. 在另一侧,将用一个球关节臂来支撑Pi Camera进行定位。
这些支架/外壳将用笔者信任的Prusa i3 MK3S 3D打印机打印。
图1—树莓派+4G/GPS防护外壳
图2—用球关节支撑Pi Camera进行定位
图1和图2显示了实施时的结构。请注意,C型夹持器是可插拔的,所以已经打印的支架不附带树莓派的外壳和Pi Camera的支架。它们有一个插座,可将支架插入其中。如某一个读者决定复制该项目,这是非常有用的。只需调整支架,使其适应汽车后视镜。目前,笔者车上(是一台路虎神行者)的夹持器功能良好。
图3—PiCamera支架结构的侧视图