我只用57行代码就复刻一个8600万美元的大项目!

百家 作者:程序人生 2017-09-13 06:01:01

维多利亚警察局是澳大利亚维多利亚州的主要执法机构。 过去一年,维多利亚州共有超过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万美元。

感谢Drew Firment。


本文转载自:众成翻译
译者:jshhcdxs
原文:https://medium.com/@taitems/how-i-replicated-an-86-million-project-in-57-lines-of-code-277031330ee9


看完此文,有什么想法或观点呢?欢迎在留言区留言评论。


更多精彩

王小波程序员我会编程七夕表白程序员最高殊荣程序猿(媛)CP祭天Python歌词特斯拉程序媛直播鄙视链敲代码404结婚Facebook怎么进BAT女友日记高逼格指南计算机专业技能干货九寨沟地震编程习惯陆奇演讲自救指南周鸿祎谈创业



公众号ID:coder_life

扫码关注CSDN程序人生

程序猿(媛)的专属公号

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接