Программист в одиночку реализовал прототип системы розыска угнанных авто стоимостью $70 миллионов

Власти австралийского штата Виктория в 2015 году работали над системой распознавания угнанных автомобилей по номерным знакам. По оценкам экспертов, реализация проекта обошлась бы штату в 86 млн австралийских долларов (70 млн долларов США или чуть более 4 млрд рублей). Местный программист Тэйт Браун решил сделать что-то подобное сам — и у него получилось!

В чём заключалась его идея?

Во-первых, знаки машин должны распознаваться локально — в противном случае счета за Интернет были бы астрономическими. Во-вторых, система должна распознавать изображения низкого качества, полученные с видеорегистратора. И в-третьих, всё используемое ПО должно быть открытым.

В своей системе Тэйт использовал библиотеку 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
	};
}

В конечном итоге система оказалась способна распознавать номера автомобилей с достаточно высокой точностью:

Тэйт Браун признаёт, что система, которую хотят создать власти, намного сложнее, чем придумал он. В частности, много денег придется потратить на хранение данных и обучение алгоритмов для повышения точности распознавания. Тем не менее, Браун полагает, что сумма в 70 миллионов сильно завышена.

Источник: Medium