Автоматизировать можно многое, хотя и не все. Но все же при помощи автоматизации можно значительно облегчить себе жизнь, сделав ее комфортнее и, в некоторых случаях, безопаснее. В смысле, обезопасить себя от начальства. Один из разработчиков нейросетей решил создать систему, которая при приближении начальника сразу же сворачивала «неподходящие окна», скрывая их с глаз долой.
Для пользователя действия системы выглядят вполне прозрачно, поскольку нейросеть после обнаружения приближающегося босса выдает соответствующее уведомление. И только потом сворачивает окна, выдавая еще одно предупреждение. Сама система занимается тем, что при помощи обычной веб-камеры хорошего качества фиксирует лица людей, приближающихся к рабочему столу, а при выявлении начальства быстро убирает все с экрана компьютера, от греха подальше. При разработке использована библиотека Keras, которая упростила задачу. Как все это работает?
Да особо ничего сложного, никаких особенных проблем при реализации системы разработчик не получил. Кстати, одно из условий при создании такой системы было научить нейронную сеть распознавать лицо начальника с 5-7 метров, чтобы не переживать из-за того, что босс сможет все разглядеть с близкого расстояния. Времени на идентификацию босса немного — всего около 4-5 секунд.
Конечно, ничего хорошего в том, чтобы заниматься на работе посторонними делами, нет. Этот пример — просто работающая система, которую сделали, скорее фана ради, чем из-за каких-то реальных проблем начальством.
Так вот, разработчик решил постоянно фотографировать все, что происходит вокругг, с тем, чтобы заметить вовремя начальника. Система обнаружения получила название Boss Sensor.
В работе системы все просто:
- Веб-камера отслеживает ситуацию в «поле зрения»;
- Нейросеть пробует определить и распознать лицо на фотографии;
- Если объект идентифицирован, как начальство, переключаются экраны.
То есть, в буквальном смысле слова нужно: получить изображения лица, распознать, переключить экраны, что позволяет спрятать открытые окна с одного из рабочих столов.
Разработчик решил не мудрствовать лукаво, а использовать стандартную камеру Buffalo BSW20KM11BK.
Конечно, изображение можно создавать и самостоятельно, при помощи софта. Но лучше довериться системе — работа над ней продолжалась довольно долго, кроме того, система работает довольно точно. Что касается получения фото, то разработчик предлагает всем ознакомиться с исходниками.
Что касается обучения, то здесь все относительно просто — подобные системы довольно давно существуют. Для выполнения цели нужно выполнить три этапа:
- Сбор изображений;
- Предварительная обработка фото;
- Создание самообучающейся системы.
Реализация задумки
Сбор изображений. Для того, чтобы нейросети было, на чем тренироваться, создатели системы использовали тысячи фотографий. Их можно брать, как из частных коллекций, так и из других посылок других пользователей. Для самообучения системы нужно огромное число снимков. Их решили брать из:
- Google Image;
- Коллекции изображений на Facebook;
- Базы видеофайлов.
Изначально разработчик получил тысячи изображений с разными лицами, но его система не смогла самообучаться на основе фото. Для извлечения лиц с большого количества фотографий была использована библиотека ImageMagick.
В результате получилась вот такая база лиц сотрудников и самого босса:
Если вы хотите распознать лицо человека, лучше опробовать Web API, для изображения — инструмент вроде Computer Vision API в Cognitive Services. Разработчик решил пойти своим путем. Созданная им нейросеть имела определенную структуру:
____________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
====================================================================================================
convolution2d_1 (Convolution2D) (None, 32, 64, 64) 896 convolution2d_input_1[0][0]
____________________________________________________________________________________________________
activation_1 (Activation) (None, 32, 64, 64) 0 convolution2d_1[0][0]
____________________________________________________________________________________________________
convolution2d_2 (Convolution2D) (None, 32, 62, 62) 9248 activation_1[0][0]
____________________________________________________________________________________________________
activation_2 (Activation) (None, 32, 62, 62) 0 convolution2d_2[0][0]
____________________________________________________________________________________________________
maxpooling2d_1 (MaxPooling2D) (None, 32, 31, 31) 0 activation_2[0][0]
____________________________________________________________________________________________________
dropout_1 (Dropout) (None, 32, 31, 31) 0 maxpooling2d_1[0][0]
____________________________________________________________________________________________________
convolution2d_3 (Convolution2D) (None, 64, 31, 31) 18496 dropout_1[0][0]
____________________________________________________________________________________________________
activation_3 (Activation) (None, 64, 31, 31) 0 convolution2d_3[0][0]
____________________________________________________________________________________________________
convolution2d_4 (Convolution2D) (None, 64, 29, 29) 36928 activation_3[0][0]
____________________________________________________________________________________________________
activation_4 (Activation) (None, 64, 29, 29) 0 convolution2d_4[0][0]
____________________________________________________________________________________________________
maxpooling2d_2 (MaxPooling2D) (None, 64, 14, 14) 0 activation_4[0][0]
____________________________________________________________________________________________________
dropout_2 (Dropout) (None, 64, 14, 14) 0 maxpooling2d_2[0][0]
____________________________________________________________________________________________________
flatten_1 (Flatten) (None, 12544) 0 dropout_2[0][0]
____________________________________________________________________________________________________
dense_1 (Dense) (None, 512) 6423040 flatten_1[0][0]
____________________________________________________________________________________________________
activation_5 (Activation) (None, 512) 0 dense_1[0][0]
____________________________________________________________________________________________________
dropout_3 (Dropout) (None, 512) 0 activation_5[0][0]
____________________________________________________________________________________________________
dense_2 (Dense) (None, 2) 1026 dropout_3[0][0]
____________________________________________________________________________________________________
activation_6 (Activation) (None, 2) 0 dense_2[0][0]
====================================================================================================
Total params: 6489634
С кодом можно ознакомиться здесь. Разработчик говорит, что система стала почти безошибочно узнавать босса, когда тот появляется поблизости от камеры.
Ну а теперь необходимо задать четкую инструкцию на тот счет, если шеф таки появится рядом.
Теперь все готово, а технология опробована многократно. Теперь можно запустить систему, и сделать так, чтобы она реагировала на начальника.
После теста все оказалось работоспособным. За несколько метров до камеры босс оставался весен и спокоен. Система сделала все необходимые снимки провела анализ и смогла правильно идентифицировать босса разработчика. Тест одно значно показал — все работает.
Исходный код такой системы можно найти по этой ссылке.
Система идентификации сначала определила, что действительно, идет начальник, затем ей удалось распознать снимок и… да, свернуть все окна. На данный момент определение лица идет с использованием OpenCV. Возможно, Dlib позволит улучшить точность распознавания.
Есть, конечно, и более серьезные проекты, где готовят, например, системы машинного зрения, которые обучают по компьютерным играм. Нейросети становятся все более востребованными — с ними работают разработчики автомобилей, ученые, создатели роботизированных систем и другие специалисты.
Автор: marks