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

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


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



    入门工程应用计算机视觉javascript目标识别汽车
    1