Отчего не Большой Адронный Коллайдер? Где дача, а где нейросеть? - спросите вы. Однако все гораздо ближе, чем кажется.
Сделать маленькую нейросеть на даче меня сподвигли лень и всегда проигрывающий ей интерес к новым технологиям.
Причина в том, что имея камеры видеонаблюдения и весьма большой архив фотографий (за несколько лет), я так не получил от этой системы того, что хотелось бы получать. Конечно, исходя из современных компьютерных возможностей.
Проблема моего дачного видеонаблюдения в ложных срабатываниях и в накоплении большого количества ненужного барахла в виде фотографий, которые никто не будет смотреть.
Некоторые видеокамеры размещены так, что срабатывают и начинают запись из-за проезжающей рядом машины. Но ведь эта машина едет мимо и ко мне отношения не имеет, она не остановилась и из нее не выходил человек. Поэтому на такую машину лучше бы не реагировать. Это первая цель.
А в качестве второй цели - мне бы хотелось, чтобы в архив сохранялась не только сама фотография (или видео), а и некоторый сопровожающий тег типа "Машина", "Человек", "Собака". Чтобы по этому тегу можно было искать и сортировать большой объем данных.
Для этого мне и потребовалась нейросеть. Но как?
Нейросеть это, в данном случае и очень грубо - набор алгоритмов, которые обрабатывают загруженные в них фотографии и строят "модель". Эта модель сопровождается словами-описаниями того, что изображено на картинке и, первоначально, эти слова добавляют люди, которые классифицировали то, что изображено на картинке.
Если вы вспомните капчу гугла, то там иногда всплывает вопрос с просьбой выбрать все картинки, на которых изображены дорожные знаки. Выбирая вы, скорее всего, вносите свой вклад в классификацию фотографий и обучение модели. Ну так продолжим ...
Допустим у вас появилась некоторая обученная "модель" и теперь вы загружаете в программу новую фотографию, которой не было раньше. Например, если модель была обучена на большом количество фотографий автомобиля, (который, как мы понимаем, имеет свои отличительные признаки и здорово отличается от изображения пиццы), то мы загружаем в программу свою фотографию автомобиля и получаем ответ: "Автомобиль с вероятностью 0,85". Чем ближе ваша фотография к тому, на чем была обучена модель, тем больше вероятность верного обнаружения.
Именно это мне и было нужно для моей нейросети.
Начал я с простого (ха-ха) и по совету товарищей обратился к бесплатной программе TensorFlow от компании Google. На их сайте есть пример того, как можно распознать содержимое своей фотографии с помощью их, гугловой, обученной модели. Они свою модель обучали на многомиллионной базе фотографий imagenet.
Я воспользовался примером на питоне с распознаванием панды https://www.tensorflow.org/tutorials/image_recognition
Панду распознали успешно, а затем я "скормил" в алгоритм фотографию машины, проезжающей мимо моего дачного участка. Фотография сделана с камеры домофона.
Вау! Вот результат - машина найдена!:
# python classify_image.py --image_file car_and.jpg
sports car, sport car (score = 0.38615)
car wheel (score = 0.18023)
racer, race car, racing car (score = 0.09661)
grille, radiator grille (score = 0.02517)
cab, hack, taxi, taxicab (score = 0.02446)
Как видите, это всего лишь одна команда, которая выдает нужный результат, а значит обработать этот вывод проще простого. Можно поместить этот тэг в базу вместе с фотографией ну или в любое другое место. Обработка одной фотографии заняла около 2 секунд.
Хорошо, а что же будет, если нет проезжающей машины, а просто пошел снег?
bucket, pail (score = 0.64005)
ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin (score = 0.20549)
pot, flowerpot (score = 0.01064)
mailbox, letter box (score = 0.00715)
barrow, garden cart, lawn cart, wheelbarrow (score = 0.00649)
Ну что же, значит подобные "пустые" фотографии будут с тегом "мусорка" и меня это вполне устраивает. Это можно отфильтровать и в качестве тега не сохранять - я и так знаю, что там мусорка. :)
Ну если пробовать дальше, то все становится не очень хорошо. Ну вот, например, неопознанная кошка
ashcan, trash can, garbage can, wastebin, ash bin, ash-bin, ashbin, dustbin, trash barrel, trash bin (score = 0.33343)
bucket, pail (score = 0.25852)
shovel (score = 0.01506)
mailbox, letter box (score = 0.01461)
swab, swob, mop (score = 0.01376)
Но кошка это все мелочи - на следующей фотографии не найден человек, но, найдена небольшая собачка, которой ошибочно дали другую породу - Грюнендаль :) Очень хорошо что собачку нашли, но где же человек?
groenendael (score = 0.25312)
schipperke (score = 0.16223)
Bouvier des Flandres, Bouviers des Flandres (score = 0.07632)
dogsled, dog sled, dog sleigh (score = 0.01775)
Scottish deerhound, deerhound (score = 0.01712)
Я начал было думать, что оценке мешает мусорный бак и нашел фотографию, где человек закрывает собой мусорку, в надежде найти в результате распознавания человека, но увы...
ski (score = 0.62018)
dogsled, dog sled, dog sleigh (score = 0.06263)
snowmobile (score = 0.02722)
alp (score = 0.02159)
lakeside, lakeshore (score = 0.01842)
Лыжи, собачья упряжка и снегоход, но вот человека нет :)
На этом мой эксперимент закончился, так как система не опознала достаточно важную часть - человека. Виной этому, скорее всего, отсутствие "человека" в той самой модели, на которой была обучена сеть. Значит есть два варинта - найти другую модель или создать свою. Однако, во втором случае классифицировать все придется самому вручную.
У меня скопились сотни тысяч файлов, которые, наверное, можно классифицировать, пересматривать их и отмечать там "человека", но это весьма нудное занятие. Хотя есть шанс, что сеть будет "заточена под себя" и обучена на своем собственном архиве.
Так что попробовать можно :)
Продолжение следует ...
PS: Спасибо системе при помощи которой я организовал удаленное видеонаблюдение на даче!