当使用现有开源技术的实验做“足够好”的工作时

维多利亚警察局是澳大利亚维多利亚州的主要执法机构。去年维多利亚州有超过16,000辆汽车被盗 - 耗资约1.7亿美元 - 警察部门正在试验各种技术驱动的解决方案,以打击汽车盗窃行为。他们称这个系统为BlueNet。为了防止被盗车辆的欺诈性销售,已经有一项VicRoads 基于网络的服务,用于检查车辆登记的状态。该部门还投资了一个固定式车牌扫描仪 - 一个固定三脚架相机,扫描过往交通,自动识别被盗车辆。不要问我为什么,但是有一天下午,我有一个车载车牌扫描仪原型的愿望,如果车辆被盗或未注册,它会自动通知你。了解这些单独的组件存在,我想知道将它们连接在一起是多么困难。但是,经过一番谷歌搜索,我发现维多利亚警方最近经历了类似设备的试验,估计推出的成本约为86,000,000美元。一位精明的评论者指出,安装220辆汽车的成本为8600万美元,相当于每辆汽车390,909美元。当然,我们可以做得更好。

成功标准

在开始之前,我概述了产品设计的一些关键要求。

要求#1:图像处理必须在本地执行

将实时视频流式传输到中央处理仓库似乎是解决此问题的最有效方法。除了高昂的数据流量账单外,您还会将网络延迟引入到可能已经很慢的流程中。

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

要求2:必须使用低质量图像

由于我没有Raspberry Pi摄像头或USB网络摄像头,因此我将使用dashcam镜头 - 它随时可用并且是样本数据的理想来源。作为额外的奖励,dashcam视频代表了您对车载摄像头所期望的镜头的整体质量。

要求#3:需要使用开源技术构建

依靠专有软件意味着您每次请求更改或增强时都会受到攻击 - 并且此后每次请求都会继续刺痛。使用开源技术是一个明智的选择。

My solution

在较高的层次上,我的解决方案从dashcam视频中获取图像,通过设备本地安装的开源牌照识别系统,查询注册检查服务,然后返回结果进行显示。

返回执法车辆中安装的设备的数据包括车辆的品牌和型号(仅用于验证车牌是否被盗),登记状态以及被报告车辆被盗的任何通知。

如果这听起来很简单,那是因为它确实如此。例如,图像处理都可以由openalpr library.

这真的是识别车牌上的角色所涉及的所有内容:

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

A Minor Caveat
公共访问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
};

}


Results我必须说我很惊喜。我预计开源车牌识别非常垃圾。此外,图像识别算法可能未针对澳大利亚车牌进行优化。该解决方案能够识别广泛视野中的车牌。

为效果添加了注释。尽管有反射和镜头失真,但仍能识别车牌

虽然,解决方案偶尔会遇到特定字母的问题。

读板错误,将M误认为是H.

但是......解决方案最终会使它们变得正确。

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

正如您在上面两张图片中看到的那样,处理图像几帧后,从87%的置信度评分跳到91%以上的头发。我很有信心,原谅双关语,通过提高采样率,然后按最高置信度等级排序,可以提高准确性。或者,可以设置阈值,该阈值在继续验证注册号之前仅接受大于90%的置信度。这些是非常直接的代码优先修复,并不排除使用本地数据集训练车牌识别软件。86,000,000美元的问题公平地说,我完全不知道$ 86M这个数字包括什么 - 我也不能说我的开源工具的准确性,没有本地化培训与试点BlueNet系统。我希望预算的一部分包括更换几个遗留数据库和软件应用程序,以支持每辆车每秒数次高频率,低延迟地查询车牌。另一方面,每辆车约39.1万美元的成本似乎相当丰富 - 特别是如果BlueNet不是特别准确,并且没有大规模的IT项目退役或升级依赖系统。Future Applications虽然很容易陷入奥威尔式的“永远在线”牌照狙击手网络中,但这项技术有许多积极的应用。想象一下被动系统扫描同伴驾驶者的绑架车,自动警告当局和家庭成员他们当前的位置和方向。特斯拉斯的车辆已经充满了能够接收OTA更新的摄像头和传感器 - 想象一下,这些变成了一群虚拟的好撒玛利亚人。 Ubers和Lyft司机也可以配备这些设备,以大幅增加覆盖范围。使用开源技术和现有组件,似乎可以提供一种提供更高回报率的解决方案 - 投资远低于8600万美元。


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