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

当使用现有的开源技术进行实验时可以将工作做到“足够好”

图0:我是如何用57行代码复制了一个8600万美元的项目的

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

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

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

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

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

图1:我是如何用57行代码复制了一个8600万美元的项目的 现有固定车牌识别系统


成功的标准

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

图像处理必须在本地执行

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

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

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

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

结果

我必须说我很惊喜。

我原以为开源车牌识别会相当垃圾。此外,图像识别算法可能没有针对澳大利亚车牌进行优化。

实际却发现该解决方案能够在各种视野中识别车牌。

图2:我是如何用57行代码复制了一个8600万美元的项目的 添加注释生效。 尽管有反光和镜头失真,但确定了牌号。

虽然解决方案对特定字母识别有问题。

图3:我是如何用57行代码复制了一个8600万美元的项目的 车牌识别不正确,误把M当作H

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

图4:我是如何用57行代码复制了一个8600万美元的项目的 几帧后,M被正确识别,并具有更高的置信度

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

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

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

8600万美元的问题

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

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

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

未来的应用

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

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

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

感谢Drew Firment

本文文字及图片出自 www.zcfy.cc

你也许感兴趣的:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注