教程 | 如何通过57行代码复制价值8600万澳元的车牌识别项目

选自Medium

作者:Tait Brown

机器之心编译

参与:蒋思源、黄小天

Tait Brown 利用 Openalpr 库和 VicRoads API 等通过 57 行 javascript 代码实现了澳洲车牌识别并检测是否被盗。

维多利亚警察局是澳大利亚维多利亚州的主要执法机构。去年在维多利亚州有超过 16000 车辆被偷,造成的经济损失约 1.7 亿美元,警察局正积极尝试多种技术方案攻克这一问题。

为了阻止被偷车辆的非法交易,已经有了一项名叫 VicRoads 的网络服务检查被偷车辆的登记状态。警方还投资了一个固定式汽车牌照扫描仪,它带有一个固定的三脚架摄像头,可以扫描过往车辆并自动识别被偷车辆。

我也不知道为什么,但是有一天的下午,我突然有了打造一个车载拍照扫描仪原型的想法,它可以自动提醒你一辆车是已被偷或未登记。搞明白了已有的单独组件之后,我在想把它们组装起来的难度有多大。

经过一番谷歌搜索,我发现维多利亚经法已在试验一个类似的项目,项目成本预估在 8600 万澳元。一位敏锐的评论员指出,一个 8600 万澳元($)的项目装配在 220 辆车上,平均每辆车的费用是 390909 澳元。

因此,我们当然可以做的更好。

固定式车牌识别系统

成功标准

在开始之前,我概述了产品设计所需的若干个关键需求。

图像处理必须本地执行

把实时视频流传递到中央处理仓库似乎是解决这一问题的效率最低的方法。除了数据量的巨大开支,你也将把网络延迟引入到已经相当缓慢的过程中。

尽管中心化的机器学习算法会随着时间变的更精确,我想知道一个本地的设备上的实现是否足够好。

必须使用低质量图像

尽管我没有树莓派摄像头或 USB 网络摄像头,因此我将会使用 dashcam 镜头,它易于获取,是样本数据的理想来源。作为有一个额外的好处,dashcam 视频代表了像车载摄像头一样的镜头整体质量。

必须使用开源技术构建

如果使用专利软件,那么每一次修改系统或增强系统就会受到阻拦,并且每一次请求都可能出现错误。而使用开源技术就显得十分简单了。

解决方案

从高层次来说,我的解决方法从 dashcam 视频中获取图像,然后将图像传入安装在本地的开源车牌识别系统并请求执行登记检查服务,最后再返回结果。

数据将返回到安装在执法车辆上的设备,包括车辆制造商和型号(只有牌照被盗时才会验证)、登记状态和车辆被盗时的通知。

这确实挺简单的,因为图像处理都可以由 Openalpr 库完成。而我们识别车牌上的字符只需要如下简单的调用就行:

openalpr.IdentifyLicense(imagePath, function (error, output) {
   // handle result
});

注意:VicRoads API 并不能公共访问,因此该原型只能从网页中爬取牌照检测。以下是这一方法的概念验证代码:

// Open form and submit enquire for `rego`
function getInfo(rego) {
    horseman
      .userAgent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0')
      .open(url)
      .type('#registration-number-ctrl input[type=text]', rego)
      .click('.btn-holder input')
      .waitForSelector('.ctrl-holder.ctrl-readonly')
      .html()
      .then(function(body) {
        console.log(processInfo(body, rego));
        return horseman.close();
      });
}

// Scrape the results for key info
function processInfo(html, rego) {
    var $ = cheerio.load(html);
    var vehicle = $('label.label').filter(function() {
      return $(this).text().trim() === 'Vehicle:';
    }).next().text().trim();

    var stolen = $('label.label').filter(function() {
      return $(this).text().trim() === 'Stolen status:';
    }).next().text().trim();

    var registration = $('label.label').filter(function() {
      return $(this).text().trim() === 'Registration status & expiry date:';
    }).next().text().trim();

    return {
        rego,
        vehicle,
        stolen,
        registration
    };
}

结果

结果十分令人吃惊,因为开源车牌识别系统的效果非常好,虽然该算法并没有针对澳洲牌照进行优化,但这一解决方案如下能在广泛视野上识别车牌。

如上图所示,即使有玻璃反光和角度变形,该系统也能正确识别车牌号。但该系统如下也会在特定的一些字母上遇到问题。

错误地将 M 识别为 H

但是大多数时间该系统还是能正确地执行识别和检测任务的。

我们可以提高采样率而提升准确度,并且最后以置信度为标准对识别结果进行排序。我们也可以调整阈值为 90%,只有大于它才接受登记号验证。这些都是通用的改进项,即使使用本地数据集训练车牌识别系统同样也适用。

8600 万澳元的问题

我并不知道这一笔资金具体包括什么,我也不能对比不在本地训练的开源工具和 pilot BlueNet 系统的性能。我猜测预算可能包含数据集与软件应用来支持高频次、低延迟的牌照检测等。

未来应用

虽然很容易陷入奥威尔性质的永远在线的车牌盗贼网络,这一技术也有着很多积极应用。想象一下一个自动扫描车牌的系统,可以把车辆的位置和方向信息反馈给警方和原车主。

特斯拉已配备了摄像头和传感器,可接收 OTA 更新——想象一下把它们全部变成善良的撒马利亚人的场景。Uber 和 Lyft 司机也能够配备这些装置,从而显著增加覆盖范围。

通过开源技术和现有组件获得一个解决被盗车辆问题的好方案是可能的——并且成本要远低于 8600 万澳元。

原文地址:https://medium.freecodecamp.org/how-i-replicated-an-86-million-project-in-57-lines-of-code-277031330ee9

本文为机器之心编译,转载请联系本公众号获得授权。

本文分享自微信公众号 - 机器之心(almosthuman2014)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-09-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏算法修养

HDU-1166敌兵布阵(线段树)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java...

35340
来自专栏从零开始的linux

linux进程和线程

查看进程数 [root@alex ~]# ps -ef | grep nginx | wc -l 3 查看线程数 [root@alex ~]# pstree ...

591110
来自专栏PPV课数据科学社区

他新学技术成了部门经理,你还在停滞不前吗?关于学习的坚持,你get到了吗?

? 小编寄语:从事数据挖掘有一定学习门槛和周期,但只要你专注、实践、坚持,就可以拿到职业入场券。仰望星空,已经有一些先行者,也就是数据界的“大咖”在远处朝你招...

369100
来自专栏Bingo的深度学习杂货店

Java 实现微信自动登录

需求: 用户通过微信进行登录,如果是第一次登录,则进入绑定界面,需要用户输入用户名和密码保存到数据库;如果不是第一次登录,则直接跳过绑定界面,实现微信自动登录。...

86350
来自专栏JAVA技术zhai

我用了7年时间成长为阿里Java架构师,你呢(附学习路线图)

前言:我用了七年的时间,一步一步走到了现在,中途也有了解过其他的技术,也想过要转其他的语言,但是最后还是坚持下来走Java这条路,希望我的经历可以帮助到后来的人...

718130
来自专栏从零开始的linux

elasticsearch集群

安装elasticsearch集群 hostnameipportes-1128.0.0.1019200es-2128.0.0.1029200 安装jdk [ro...

33860
来自专栏AI科技大本营的专栏

“封杀中兴”后,TensorFlow 等也被“闭源”怎么办?(附中兴最新声明)

【编者按】从 Oracle “版权战”先后向 Java、JavaScript 开火,到中美贸易摩擦科技战中,中兴可能失去 Android 系统部分服务授权。当我...

40370
来自专栏大数据-Hadoop、Spark

Hive安装使用中的一些问题

1.非root用户连接mysql服务时,报如下错误, ERROR 2002 (HY000): Can't connect to local MySQL serv...

45980
来自专栏Bingo的深度学习杂货店

Java SDK 实现极光推送

公司项目,要做一个告警推送,将告警信息推送到手机上。我采取的是现比较流行的极光推送。 附上极光推送 Java SDK 文档链接: Java SDK官方文档 1....

61690
来自专栏大数据钻研

2018最具就业前景的7大编程语言,Java、Python和JavaScript?

2018 年即将到来,Coding Dojo(编码道场)近期发布了 2018 最具就业前景的 7 大编程语言。该公司分析了来自 Indeed 的 25 门编程语...

58370

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励