微信号:gh_ffb279ea1674

介绍:《奇舞周刊》是由奇舞团维护的前端技术周刊.每周五向大家推送前端技术文章.

我如何用57行代码复刻一个8600万美元的项目

2017-09-10 17:19 jshhcdxs 译

编者按:本文由jshhcdxs在众成翻译平台上翻译。使用现有的开源技术能够节省多少开支?本文的实验将为您揭晓~

维多利亚警察局是澳大利亚维多利亚州的主要执法机构。 过去一年,维多利亚州共有超过1.6万辆车被盗,损失约为1.7亿美元,警方正在试验各种技术解决方案,来打击汽车盗窃。

为了防止被盗车辆的欺诈性销售,已经有VicRoads这种在线服务用于检查车辆注册状况。当局还投资了一个固定的车牌扫描器——一个固定的三脚架摄像头,用于自动扫描识别被盗车辆。

不要问我为什么,就在某天下午,我想到制作一个车载的车牌扫描仪,如果车辆被盗或未注册,能够自动通知您。这些单独的组件是存在的,我想知道将它们协同连接起来会有多困难。

但是,经过一番谷歌搜索之后,我发现维多利亚警方最近试验了一个类似的设备,估计费用约为8600万美元。 一位精明的评论员指出,这8600万美金用来匹配220辆车,相当于每一辆车花费39.0909万美元

当然我们可以做的比这更好。

现有固定车牌识别系统


成功的标准

在开始之前,我简要罗列了产品设计的几个关键要求。

图像处理必须在本地执行

将实时视频流传向中央处理仓库似乎是解决此问题的最低效方法。除了数据流庞大的容量,您还将网络延迟引入到已经相当缓慢的过程中。

虽然集中式机器学习算法只会随着时间的推移而变得更加准确,但我想了解本地的设备实现是否“足够好”。

它必须能够解析低质量的图像

因为我没有树莓派相机或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

但是...识别最终会还是成功了。

几帧后,M被正确识别,并具有更高的置信度

正如你可以看到上述两个图像,几帧后图像处理从87%的置信度上升到91%。

我很自信,原谅我这么说,提高准确率可以通过提高抽样率,然后按最高置信度排序。或者,可以设置在验证车牌之前仅接受大于90%的置信度的阈值。

这些是非常直接的代码优先修复,并且不排除使用本地数据集训练车牌识别软件。

8600万美元的问题

老实说,我完全不知道8600万美元的系统都包含什么,也不知道本地化训练的开源工具的准确性跟官方系统相比结果如何。

我估计预算的一部分包括更新几个遗留数据库和软件应用程序,以支持每秒对多车进行高速,低延迟的车牌查询。

另一方面,每辆车的识别成本在39.1万美元左右也确实挺贵——特别是如果系统的识别结果不是特别准确,而且没有大规模的IT项目停产或升级相关系统。

未来的应用

虽然在想法上很容易陷入乔治奥威尔式的“永远在线”式的车牌告密网络,但这种技术还时有很多积极的应用。试想,一个系统扫描到一个绑匪的车,自动通报当局和家属绑匪目前的位置和方向。

特斯拉斯车辆已经拥有摄像头和传感器,能够接收OTA更新——想象将其变成一个虚拟的好心人。Ubers和Lyft司机也可以配备这些设备来大幅增加覆盖面积。

使用开源技术和现有组件,似乎有可能提供一个提供更高回报率的解决方案——投资远低于8600万美元。


奇舞周刊

——————————————————

领略前端技术 阅读奇舞周刊


长按二维码,关注奇舞周刊


 
奇舞周刊 更多文章 你不得不看的 Docker 入门指南 奇舞周刊第 226 期:代码质量管控的四个阶段 教你玩转Fiddler插件开发 Node.js创造者Ryan Dahl专访 画个漫画,告诉你什么是即时编译器JIT
猜您喜欢 精彩纷呈,惠普世界之旅高管演讲实录 聊一聊你身边的信息安全陷阱(二) High Performance Go MySQL for update 死锁案例 聊聊代码规范